21.包和工具

包和工具

查看标准包数量

1
go list std | wc -l

检索包地址

前言

特性 : 快

Go语言的闪电般的编译速度主要得益于三个语言特性。

  1. 导包在文件开头显示声明
  2. 禁止包环装依赖 , 形成有向无环图
  3. 记录包的依赖关系, 无需遍历所有依赖文件 ( 解决重复依赖 )

main 包

名字为main的包是给go build 构建命令一个信息,这个包编译完之后必须调用连接器生成一个可执行程序。

_test.go 为后缀的包

_. 开头的源文件会被构建工具忽略

所有以_test为后缀包名的测试外部扩展包都由go test命令独立编译

1. 包

1.1. 导入包

  • 在包声明语句后 , 添加导包声明 , 可以使用圆括号同时导入多个
  • 包之间可添加空行分组, 每个分组的导入顺序会被 gofmt 格式化成字母顺序
  • 循环依赖构建工具会报错

本地化导入

1
2
import . "strings"
Swap(1,3)

别名导入 用于解决包重名, 或长包名

1
2
import st "strings"
st.Swap(1,3)

匿名导入 它会计算包级变量的初始化表达式和执行导入包的init初始化函数

1
import _ "strings"

1.2. 包名

包名一般采用单数的形式。标准库的bytes、errors和strings使用了复数形式,这是为了避免和预定义的类型冲突,同样还有go/types是为了避免和type关键字冲突。

如果你计划分享或发布包,那么导入路径最好是全球唯一的。为了避免冲突,所有非标准库包的导入路径建议以所在组织的互联网域名为前缀;而且这样也有利于包的检索。

1.3. internal 内部包

一个internal包只能被和internal目录有同一个父目录的包所导入。

例如,

1
2
3
4
5
6
7
net/http/internal/chunked
// 可以导入
net/http/httputil
net/http

// 不能导入
net/url

net/http/internal/chunked内部包只能被net/http/httputil或net/http包导入,但是不能被net/url包导入。不过net/url包却可以导入net/http/httputil包。

1.4. go list 查询包

列出工作区所有包

1
go list ...

特定子目录下所有包

1
go list gopl.io/ch3/...

某个主题相关包

1
go list ...xml...

包的元信息

1
go list -json hash

命令行参数-f则允许用户使用text/template包的模板语言定义输出文本的格式。

1
go list -f "{{join .Deps \" \"}}" strconv

查询哪些 go 源文件参与编译

1
go list -f={{.GoFiles}} fmt

查询哪些 Go 测试源文件参与编译

1
go list -f={{.TestGoFiles}} fmt

1.5. 如何给已有的包添加方法( 实现继承想要做的事情 )

定义别名

1
2
3
4
5
6
// 定义别名
type alias []int

func (a alias) IsEmpty(){
  // ...
}

使用组合 将已有结构组合到新的结构中

1
2
3
4
5
type myFunc struct {
  	myint *[]int
}

// ...

导包方式

1
import . XXX

那么就会让这个“XXX”包中公开的程序实体,被当前源码文件中的代码,视为当前代码包中的程序实体。

2. 工具

1
go help   # 查看更多帮助

2.1. 下载包

1
go get ...

Go语言工具箱的go命令同时计算并下载所依赖的每个包

一旦go get命令下载了包,然后就是安装包或包对应的可执行的程序。

如果指定-u命令行标志参数,go get命令将确保所有的包和依赖的包的版本都是最新的,然后重新编译和安装它们。如果不包含该标志参数的话,而且如果包已经在本地存在,那么代码将不会被自动更新。

2.2. 构建包

go build命令编译命令行参数指定的每个包。如果包是一个库,则忽略输出结果;这可以用于检测包是可以正确编译的。如果包的名字是main,go build将调用链接器在当前目录创建一个可执行程序;以导入路径的最后一段作为可执行程序的名字。

针对不同操作系统或CPU的交叉构建也是很简单的。只需要设置好目标对应的GOOS和GOARCH,然后运行构建命令即可。

1
2
3
4
5
6
# 编译成 linux 可执行
CGO_ENABLED=0  GOOS=linux  GOARCH=amd64  go build main.go
# 编译成 Windows 可执行
CGO_ENABLED=0 GOOS=windows  GOARCH=amd64  go  build  main.go
# 编译成 Mac 可执行
CGO_ENABLED=0 GOOS=darwin  GOARCH=amd64  go build main.go

CGO_ENABLED CGO 工具, 交叉编译不能使用

GOOS : 目标平台

  • mac 对应 darwin
  • linux 对应 linux
  • windows 对应 windows

GOARCH :目标平台的体系架构

  • 386 也称 x86 对应 32位操作系统
  • amd64 也称 x64 对应 64位操作系统
  • arm

2.3. 注释的技巧

1
2
// +build ignore
package temp

在 包声明前面加入此行, 表示不编译这个文件

1
// +build linux darwin

构建过程控制

1
go doc go/build  # 更多查看文档

3. 文档

如果注释后紧跟着包声明语句,那注释对应整个包的文档。

Go语言中的文档注释一般是完整的句子,第一行通常是摘要说明,以被注释者的名字开头。注释中函数的参数或其它的标识符并不需要额外的引号或其它标记注明。

3.1. 命令

在命令行查看

go doc 后面可以跟包名/成员名/方法名

1
2
go doc time
go doc time.Since

在网页查看

1
2
go get golang.org/x/tools/cmd/godoc  # 需要先安装
godoc -http :8080

官方文档地址

Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy