打包和工具链
# 包
所有 Go 语言的程序都会组织成若干组文件,每组文件被称为一个包。每个包都可以单独导入和使用,被其他项目引用。
- 除了空行和注释,都应该在第一行声明自己所属的包。
- 每个包都在一个单独的目录里。
- 同一目录下,所有.go文件必须声明同一个报名。即不能把多个包放在同一目录中,也不能把同一个包放在不同的目录中。
- 通常包的命名就是使用包所在目录的名字,应该使用简洁,全小写的英文名字,避免频繁切换大小写
所有Go语言编译的可执行程序都必须有一个叫main
的包
main()
函数是程序的入口,如果没有这个函数,程序无法开始执行。(和C语言一样)
# 导入
导入包需要使用关键字import
,即告诉编译器需要引入该位置的包内的代码。
如果需要导入多个包,则需要将import语句包装在一个导入块中,例如:
import (
"fmt"
"strings"
)
1
2
3
4
2
3
4
编译器会使用Go环境变量设置的路径,通过引入相对路径来查找对应的包。
标准库中的包会在安装Go的位置找到,自定义的包会在GOPATH
环境变量指定的目录里找。
例如,Go安装在/usr/local/go,GOPATH设置为/home/myproject:/home/mylibraries,编译器会按照下面顺序查找net/http包:
- /usr/local/go/src/pkg/net/http
- /home/myproject/src/net/http
- /home/mylibraries/src/net/http
# 远程导入
Go语言的工具链支持从版本控制(如Github)的网站中获取源代码。
import "github.com/spf13/viper"
1
在导入路径编译程序时,Go工具链会通过网络获取包的源代码,并保存到GOPATH
与URL匹配的目录里。
这个获取过程可以使用go get
命令完成。这个命令会扫描某个包的源码树,获取能找到的所有依赖包
# 命名导入
若出现重名的情况,可以通过命名导入来到解决重名的包。
命名导入是指,在import语句给出的包路径左侧定义一个名字,将导入的包命名为新名字。
import (
"fmt"
myfmt "mylib/fmt"
)
1
2
3
4
2
3
4
- 导入的包在下文中一定要被使用,否则会被编译错误
- 如果用户导入一个包,但是不需要引用这个包的标识符,这个时候可以使用空白标识符
_
来重命名这个导入。
提示
空白标识符:下划线字符(_
),在Go语言里称为空白标识符,这个标识符用来抛弃不想继续使用的值,因此赋予一个空名字
# init函数
init函数会在程序执行开始的时候被调用,即会在main函数调用之前
作用:设置包,初始化变量,程序运行前优先完成的前导工作
# Go工具
go build
:执行编译工作,默认是用当前目录来编译,build过程中可以使用通配符,3个点表示匹配所有的字符串。
go build github.com/goinaction/code/chapter3/...
1
go clean hello.go
:执行清理工作,clean会删除编译生成的可执行文件go run
:先进行构建工作,然后执行构建后的程序go vet
:帮助开发人员检测常见的错误- Printf类函数调用时,类型匹配错误的参数
- 定义常用的方法是,方法签名的错误
- 错误的标签结构
- 没有指定字段名的结构字面量
go doc
:打印文档
# Go语言文档
// Retrieve连接到配置库,收集各种链接设置、用户名和密码。这个函数在成功时
// 返回 config 结构,否则返回一个错误。
func Retrieve() (config, error) {
// ... 省略
}
1
2
3
4
5
2
3
4
5
- 函数的文档直接写在函数声明之前
- 如果包含大量的文档,可以在工程里包含一个
doc.go
的文件,使用同样的包名,并把包的介绍使用注释加在包声明之前
# 合作开发
- 包应该在代码库的根目录中
- 包可以非常小
- 对代码执行
go fmt
- 给代码写文档
# 依赖管理
- godep
- vender
- gopkg.in
- gb
编辑 (opens new window)
上次更新: 2022/05/26, 12:36:19