go语言实战第三章读书笔记 - 打包和工具链

包名

​ 给包名取名字的惯例是包名与目录名相同,我们以net/http包为例,http文件夹下的所有文件都属于http包,并且名字简洁全都是小写,这样为了开发时方便。虽然导入包后名字通常以包名.函数名的方式引用包内容,但实际上并不要求所有包的名字都不相同,一来是在import中可以使用路径名来确定为一包,二是在导入后可以对包名重命名,这样可以有效的区别不同路径的同名包。

导包

​ 通常情况下我们导入系统包是直接”packagename”的形式导入。

1
2
3
4
import (
"fmt"
"strings"
)

此时编译器是根据go环境变量设置的路径导入的,包的搜寻路径如下:

1
2
3
# usr/local/go/src/pkg/ 标准库
# /myproject/src/ 工作目录
# /home/mylibraries/src 指定的库目录

远程导入

是的,go语言还支持分布式导入包,例如可以使用以下形式来导入包

1
2
3
import (
"github.com/username/repo/src/packagename"
)

​ 用导入路径编译程序时, go build 命令会使用 GOPATH 的设置,在磁盘上搜索这个包。事实上,这个导入路径代表一个 URL,指向 GitHub 上的代码库。如果路径包含 URL,可以使用 Go 工具链从DVCS 获取包,并把包的源代码保存在 GOPATH 指向的路径里与 URL 匹配的目录里。这个获取过程使用 go get 命令完成。 go get 将获取任意指定的 URL 的包,或者一个已经导入的包所依赖的其他包。由于 go get 的这种递归特性,这个命令会扫描某个包的源码树,获取能找到的所有依赖包。

命名导入

​ 加入要导入的俩个包名字相同,例如要导入network/convert和/file/convert时。导入的包重名了,此时应该通过重命名的方式来解决重名问题。

1
2
3
4
5
import (
"fmt"
myfmt "mylib/fmt" //重命名,此后在本文件中引用包内容时使用myfmt.的方式引用
_ "test"//初始化包,调用包的init函数
)

使用go命令行工具

常见的命令行工具有如下:

go build 和 go clean

字面意思,构建和清理。

1
2
go build hello.go #构建hello.go的源程序,文件名是hello
go clean hello.go #清理构建hello。生成的程序

go run

1
2
构建并运行go程序
go run main.go

go vet

​ 这个命令不会帮开发人员写代码,但如果开发人员已经写了一些代码, vet 命令会帮开发人员检测代码的常见错误。会捕获以下类型的错误

1
2
3
4
Printf 类函数调用时,类型匹配错误的参数。
定义常用的方法时,方法签名的错误。
错误的结构标签。
没有指定字段名的结构字面量。

使用方式

1
go vet main.go

go语言文档

go doc

在命令行中使用此命令可以很方便的获取包对应的文档,例如

1
go doc fmt
1
2
3
4
5
6
7
8
9
10
11
Package fmt implements formatted I/O with functions analogous to C's printf
and scanf. The format 'verbs' are derived from C's but are simpler.


Printing

The verbs:

General:

....

假如你不习惯在命令行中查阅文档,go也提供了浏览器查看的服务,不过此服务在go 1.13之后的版本的默认包中移除了,需要程序员手动下载配置,以下是下载地址,我安装时提示需要使用1.17之后的版本,由于我的go版本是Macos最新的1.16,此时还未提供1.17版本,因此此服务并没有安装成功,以下是对应包的下载地址

1
2
3
git clone https://github.com/golang/tools %GOPATH%/src/golang.org/x/tools
git clone https://github.com/golang/net %GOPATH%/src/golang.org/x/net
git clone https://github.com/golang/xerrors %GOPATH%/src/golang.org/x/xerrors

之后go build,mv到gopath下即可。

该命令的使用方式是

1
godoc -http:=6060

然后浏览器访问本地端口即可。