golang 包结构
golang包管理
一、gopath
gopath:进行golang开发时的工作空间,你编写的go源代码和编译后生成的可执行程序都将存放在gopath下。注意,gopath只是一个普通的文件目录并且你所有的编码工作都应该在该目录下完成(golang 1.11版本引入 包依赖管理工具go mod,可以在gopath以外编写go程序)。
配置gopath:首先创建一个目录c:\go(windows),$home/go(linux),该目录将作为gopath;gopath的目录结构如下:
bin:存放编译后的可执行文件。
src:存放go程序源码,它们被组织成包(每个目录都对应一个包)。
pkg:包对象。
在环境变量中配置gopath:
$ export gopath=$home/go $ export path=$path:$gopath/bin
注意:gopath可以包含多个目录,这些目录不能和go的安装目录相同。
二、包导入
go程序的第一行语句必须是 package pkgname
package hello // hello 为包名
go中的包名称通常以一个全小写的单词(缩写)命名(如fmt),为了自己的包名称不和go标准库中的包名称重名,对于你自己的包必须要选择一个基本路径。例如你有一个fmt的包,那你必须选择一个基本路径example.com/user/,才不会和标准库中的fmt冲突。go官方推荐使用github.com/user做为包的基本路径(user为github账号名)。go文件中的包名称(package pkgname)为go源文件所在文件夹(包)的最后一级文件夹名。
注意:对于可执行文件的包名必须为main。
package main
例子:
定义一个自己的go库:
在gopath/src下创建一个包github.com/user/hello(如果使用go mod init 可以在任意位置创建包):
# golang 1.11前 gopath模式 $ mkdir $gopath/src/github.com/user/hello $ cd $gopath/src/github.com/user/hello # golang 1.11后 go mod模式 $ mkdir $home/github.com/user/hello $ go mod init github.com/user/hello # 创建一个模块(项目)
在hello目录(包)下创建hello.go:
package hello // 包名称,包名称为go源文件所在文件夹(包)的最后一级文件夹名 import ( "fmt" ) func hello() { fmt.println("hello world") }
执行go命令:
$ go build github.com/user/hello # 将会去gopath/src寻找github.com/user/hello
使用自定义的库:
在gopath/src下创建一个包github.com/user/test:
$ mkdir $gopath/src/github.com/user/test $ cd $gopath/src/github.com/user/test
在test目录(包)下创建test.go
package main // 包名称 import ( "fmt" "github.com/killertwo/hello" // 导入自定义包 ) func main() { hello.hello() // 调用hello包中的hello() }
执行go命令:
$ go install /github.com/user/test # 将会去gopath/src寻找github.com/user/test
该命令将会在$gopath/bin 下生成可执行文件(二进制文件)test。
运行可执行文件:
$ hello # 输出: hello world
对于golang包管理官方文档有很好的介绍和例子,本文只是自己看官方文档的简单总结,如有写的不清楚的地方请看官方文档(https://golang.google.cn/doc/code.html#command)。