2019独角兽企业重金招聘Python工程师标准>>>
Golang GOPATH & 包的定义 & 包的导入
GOPATH 设置
go 命令依赖一个重要的环境变量:$GOPATH
可以在 .zshrc 配置文件中加上一行这样的配置,
export GOPATH=/Users/flyme/mygo
Go从1.1版本到1.7必须设置这个变量,而且不能和Go的安装目录一样,这个目录用来存放Go源码,Go的可运行文件,以及相应的编译之后的包文件。所以这个目录下面有三个子目录:src、bin、pkg
从go 1.8开始,GOPATH环境变量现在有一个默认值,如果它没有被设置。 它在Unix上默认为$HOME/go。
GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下。
以上 $GOPATH 目录约定有三个子目录:
- src 存放源代码(比如:.go .c .h .s等)
- pkg 编译后生成的文件(比如:.a)
- bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用
${GOPATH//://bin:}/bin
添加所有的bin目录)
.zshrc PATH 和 GOPATH 环境变量的配置
export GOPATH=/Users/flyme/mygo
export PATH=$MAVEN_HOME/bin:${GOPATH//://bin:}/bin:$PATH
检查是否配置成功,
➜ ~ echo $GOPATH
/Users/flyme/mygo:/Users/flyme/workspace-go
➜ ~ echo $PATH
/Users/flyme/IDE/apache-maven-3.3.9/bin:/Users/flyme/mygo/bin:/Users/flyme/workspace-go/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/local/mysql/bin
➜ ~
包的定义
GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/mymath 表示mymath这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包。
main package
不同于其它library package
,它定义了一个可执行程序。其中的main
函数即是可执行文件的入口函数。
所以当新建应用或者一个代码包时都是在src目录下新建一个文件夹,文件夹名称一般是代码包名称,当然也允许多级目录,例如在src下面新建了目录$GOPATH/src/github.com/astaxie/beedb 那么这个包路径就是"github.com/astaxie/beedb",包名称是最后一个目录beedb。
在每个Go源文件的开头都必须有包声明语句。包声明语句的主要目的是确定当前包被其它包导入时默认的标识符(也称为包名)。
例如,math/rand包的每个源文件的开头都包含package rand包声明语句,所以当你导入这个包,你就可以用rand.Int、rand.Float64类似的方式访问包的成员。
关于默认包名一般采用导入路径名的最后一段的约定也有三种例外情况。
第一个例外,包对应一个可执行程序,也就是main包,这时候main包本身的导入路径是无关紧要的。名字为main的包是给go build构建命令一个信息,这个包编译完之后必须调用连接器生成一个可执行程序。
第二个例外,包所在的目录中可能有一些文件名是以test.go为后缀的Go源文件,并且这些源文件声明的包名也是以test为后缀名的。这种目录可以包含两种包:一种普通包,加一种则是测试的外部扩展包。所有以test为后缀包名的测试外部扩展包都由go test命令独立编译,普通包和测试的外部扩展包是相互独立的。
第三个例外,一些依赖版本号的管理工具会在导入路径后追加版本号信息,例如"gopkg.in/yaml.v2"。这种情况下包的名字并不包含版本号后缀,而是yaml。
包的导入声明
如果我们想同时导入两个有着名字相同的包,例如math/rand包和crypto/rand包,那么导入声明必须至少为一个同名包指定一个新的包名以避免冲突。这叫做导入包的重命名。
import ("crypto/rand"mrand "math/rand" // alternative name mrand avoids conflict
)
包的匿名导入
如果只是导入一个包而并不使用导入的包将会导致一个编译错误。但是有时候我们只是想利用导入包而产生的副作用:它会计算包级变量的初始化表达式和执行导入包的init初始化函数。这时候我们需要抑制“unused import”编译错误,我们可以用下划线来重命名导入的包。像往常一样,下划线为空白标识符,并不能被访问。
import _ "image/png" // register PNG decoder
============END============