包的结构:
每个工作空间必须有由bin、pkg、src三个目录组成。
bin目录主要存放可执行文件;
pkg目录存放编译好的库文件,主要是*.a文件;
src目录主要存放Go语言的源文件。
1、工作空间
GOROOT是一个全局并且唯一的变量,用于指定存放Go语言本身的目录路径(安装路径)。
GOPATH是一个工作空间的变量,它可以有很多个(用;号分隔),用于指定工作空间的目录路径。
通常go get会使用的第一个工作空间保存下载的第三方库(包)。
需要注意的一点就是尽量不要把GOROOT和GOPATH设置为同一个路径。
2、包的源文件
包的代码必须全部都放在包中,并且源文件头部都必须一致使用package<name>的语句进行声明。
Go语言包可以由多个文件组成,所以,文件名不需要与包名一致,包名建议使用小写字符。
目录名尽量不要使用保留名称(main、all、std),对于可执行文件必须包含package main以及入口函数main。
Go语言使用名称首字母大小写来判断一个对象(全局变量、全局常量、类型、结构字段、函数、方法)的访问权限,对于包而言同样如此。包中成员名称首字母大小写决定了该成员的访问权限。首字母大写,可被包外访问,即为public(公开的);首字母小写,则仅包内成员可以访问,即为internal(内部的)。
如果使用汉字作为一个函数的名称,该函数默认是私有的,需要在汉字前面加上一个大写字母才能便其变为公有函数。
3、包的声明
对于包外而言,在导入包的时候可以使用“包名.函数名”的方式使用包内函数。
包的导入
使用包成员之前先要导入包。导入包的关键字是import。
import "相对目录/包主文件名"
相对目录是指从/pkg/开始的子目录,以标准库为例:
import "fmt" 对应/go/pkg/linux_amd64/fmt.a
import "os/exec" 对应/go/pkg/linux_amd64/os/exec.a
1.导入声明
import "crypto/rand" //默认模式:rand.Function
import R "crypto/rand" //包重命名:R.Function
import . "crypto/rand" //简便模式:Function
import _ "crypto/rand" //匿名导入:仅让该包执行初始化函数
另一种写法:
import(
"crypto/rand"
mrand "math/rand" //包重命名
)
注意:
(1)Go语言不允许导入包却又不使用。
(2)包的重命名不仅可以用于解决包名冲突,还可以解决包名过长、避免与变量或常量名称冲突等情况。
2.导入路径
3.自定义路径
一是直接在包链接中加上VCS格式,目前支持的格式有:
Bazaar .bzr
Git .git
Mercurial .hg
Subversion .svn
第二种是针对没有提供版本控制符的链接产,go get甚至不知道应该如何下载代码的情况。
第三种是重定向网页链接。
4.匿名导入
包的使用
test.go代码如下:
package test
func Even(i int) bool { //公开函数
return i%2 == 0
}
func odd(i int) bool { //私有函数
return i%2 == 1
}
保存test.go文件,最后使用go build和go install命令编译和安装这个包。
main.go代码如下:
package main
import (
"fmt"
"test"
)
func main() {
i := 5
fmt.Printf("Is %d even? %v\n", i, test.Even(i))
}
运行结果如下:(运行失败)
Go语言工具箱
1.包文档
为了更好地管理文档(注释),Go语言提供了两个工具。
第一:go doc命令,该命令打印包的声明和每个成员的文档注释。
第二:godoc,它提供可以相互交叉引用的HTML页面,输出的信息会比go doc要多一些。godoc有一个在线服务:https://godoc.org,它包含了成千上万的开源包的文档检索。
2.内部包
Go语言的封装只有两个特性:一个是私有的不可导出的成员,另一个是公开的可导出的成员。
3.查询包
go list命令可以查询可用包的信息。
如果用它来列表工作区中的所有包:go list ...
go list命令还可以获取每个包完整的元数据,而不仅仅只是导入路径,这些元数据以不同格式提供给用户。其中-json命令行参数表示用JSON格式打印每个包的元数据。
查询时同样可以使用Go template格式化输出元数据。
自定义包
1.包的制作
创建自定义包最好是在GOPATH/src目录下。
如果在项目目录中执行go build命令,将获得一个可执行文件。
如果想在GOPATH/bin目录中生成可执行文件,或者如果想让其它使用程序也可以使用这个包,必须使用go install安装。
2.特定平台的代码
3.godoc生成文档
4.包的打包与发布
目前社区中比较主流的处理方式有三种,一是使用Go.rice,还有使用Statik,最后一个是比较老旧但接口丰富的go-bindata
安装方式都是使用go get获取的:
go get github.com/raky11/statik
go get github.com/GeertJohan/go.rice
go get github.com/GeertJohan/go.rice/rice
go get github.com/jteeuwen/go-bindata
1) go.rice
需要在main.go中导入这个包:import "github.com/GeertJohan/go.rice"
它不仅仅是一个打包工具,还是一个静态文件操作库存,自带文件访问服务。
2)statik
3)go-bindata
5.自定义包的导入