3.2 导入
我们已经了解如何把代码组织到包里,现在让我们来看看如何导入这些包,以便可以访问包内的代码。 import
语句告诉编译器到磁盘的哪里去找想要导入的包。导入包需要使用关键字 import
,它会告诉编译器你想引用该位置的包内的代码。如果需要导入多个包,习惯上是将 import
语句包装在一个导入块中,代码清单 3-3 展示了一个例子。
代码清单 3-3 import
声明块
import (
"fmt"
"strings" ●―――― strings 包提供了很多关于字符串的操作,如查找、替换或者变换。可以通过访问 http://golang.org/pkg/strings/ 或者在终端运行 godoc strings 来了解更多关于 strings 包的细节。
)
编译器会使用 Go 环境变量设置的路径,通过引入的相对路径来查找磁盘上的包。标准库中的包会在安装 Go 的位置找到。Go 开发者创建的包会在 GOPATH
环境变量指定的目录里查找。 GOPATH
指定的这些目录就是开发者的个人工作空间。
举个例子。如果 Go 安装在/usr/local/go,并且环境变量 GOPATH
设置为/home/myproject:/home/ mylibraries,编译器就会按照下面的顺序查找 net/http
包:
/usr/local/go/src/pkg/net/http ●―――― 这就是标准库源代码所在的位置。
/home/myproject/src/net/http /home/mylibraries/src/net/http
一旦编译器找到一个满足 import
语句的包,就停止进一步查找。有一件重要的事需要记住,编译器会首先查找 Go 的安装目录,然后才会按顺序查找 GOPATH
变量里列出的目录。
如果编译器查遍 GOPATH
也没有找到要导入的包,那么在试图对程序执行 run
或者 build
的时候就会出错。本章后面会介绍如何通过 go get
命令来修正这种错误。
3.2.1 远程导入
目前的大势所趋是,使用分布式版本控制系统(Distributed Version Control Systems,DVCS)来分享代码,如 GitHub、Launchpad 还有 Bitbucket。Go 语言的工具链本身就支持从这些网站及类似网站获取源代码。Go 工具链会使用导入路径确定需要获取的代码在网络的什么地方。
例如:
import "github.com/spf13/viper"
用导入路径编译程序时, go build
命令会使用 GOPATH
的设置,在磁盘上搜索这个包。事实上,这个导入路径代表一个 URL,指向 GitHub 上的代码库。如果路径包含 URL,可以使用 Go 工具链从 DVCS 获取包,并把包的源代码保存在 GOPATH
指向的路径里与 URL 匹配的目录里。这个获取过程使用 go get
命令完成。 go get
将获取任意指定的 URL 的包,或者一个已经导入的包所依赖的其他包。由于 go get
的这种递归特性,这个命令会扫描某个包的源码树,获取能找到的所有依赖包。
3.2.2 命名导入
如果要导入的多个包具有相同的名字,会发生什么?例如,既需要 network/convert
包来转换从网络读取的数据,又需要 file/convert
包来转换从文本文件读取的数据时,就会同时导入两个名叫 convert
的包。这种情况下,重名的包可以通过 命名导入 来导入。命名导入是指,在 import
语句给出的包路径的左侧定义一个名字,将导入的包命名为新名字。
例如,若用户已经使用了标准库里的 fmt
包,现在要导入自己项目里名叫 fmt
的包,就可以通过代码清单 3-4 所示的命名导入方式,在导入时重新命名自己的包。
代码清单 3-4 重命名导入
01 package main
02
03 import (
04 "fmt"
05 myfmt "mylib/fmt"
06 )
07
08 func main() {
09 fmt.Println("Standard Library")
10 myfmt.Println("mylib/fmt")
11 }
当你导入了一个不在代码里使用的包时,Go 编译器会编译失败,并输出一个错误。Go 开发团队认为,这个特性可以防止导入了未被使用的包,避免代码变得臃肿。虽然这个特性会让人觉得很烦,但 Go 开发团队仍然花了很大的力气说服自己,决定加入这个特性,用来避免其他编程语言里常常遇到的一些问题,如得到一个塞满未使用库的超大可执行文件。很多语言在这种情况会使用警告做提示,而 Go 开发团队认为,与其让编译器告警,不如直接失败更有意义。每个编译过大型 C 程序的人都知道,在浩如烟海的编译器警告里找到一条有用的信息是多么困难的一件事。这种情况下编译失败会更加明确。
有时,用户可能需要导入一个包,但是不需要引用这个包的标识符。在这种情况,可以使用空白标识符 _
来重命名这个导入。我们下节会讲到这个特性的用法。
空白标识符 下划线字符(
_
)在 Go 语言里称为空白标识符,有很多用法。这个标识符用来抛弃不想继续使用的值,如给导入的包赋予一个空名字,或者忽略函数返回的你不感兴趣的值。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论