在上一篇中, make.bash使用cmd下的文件重新安装工具,我们来看一下每个工具对应的命令信息
# go 命令教程
go 是使用 src/cmd/go 进行安装的, 安装后的位置在和src同级的bin目录下.查看`cmd/go/main.go`文件, init函数对go工具命令进行了初始化
```go
func init() {
base.Go.Commands = []*base.Command{
...
}
}
```
## go help
查看main函数,可以看到,当传入的第一个参数为help时,在控制台输出帮助信息
```go
func main() {
...
if args[0] == "help" {
counter.Inc("go/subcommand:" + strings.Join(append([]string{"help"}, args[1:]...), "-"))
help.Help(os.Stdout, args[1:])
return
}
}
```
## go bug
打开浏览器进入github,向golang/go提一个issue, 会将当前系统中的信息和go版本一并写入,我们只需要写相应的问题即可提一个issue
参数:
- -v: 向控制台输出启动时遇到的问题
## go build
编译包和依赖项, 在编译包时,会忽略以 `_test.go` 结尾的文件, 参数可以和 clean, get, install, list, run test命令共享。
如果同时编译多个文件或者多个包时,只会做检查性编译,不会输出结果。
参数:
- -C:修改命令运行位置,该参数必须放在第一位。
- go build -C E:\code'study\cmd\apiserver: 编译 E:\code'study\cmd\apiserver 文件,生成后文件放在 E:\code'study\cmd\apiserver 下
- go build -C E:\code\study ./cmd/apiserver: 编译E:\code\study\cmd\apiserver文件,生成后文件放在 E:\code\study下
- -a: 强制重新构建所有涉及到的代码包
- -x: 打印编译期间用到的命令
- -n: 打印编译期间用到的命令,但不执行
- -p n: 可以并行运行的程序数量
- -race: 开启竞态条件的检测, 检查是否有多个goroutine同时访问以一个共享变量,并且至少有一个访问是写操作
- -v: 编译时打印包名称
- go build -a -v -p 1: 编译时按顺序输出目标代码包的所有依赖包
- -work: 打印编译时生成的临时工作目录,并在编译结束时保存,默认结束时删除
- -asmflags: 用于控制go语言编译器编译汇编语言文件时的行为
- 主要用来调试和优化汇编代码,控制调试信息,跨平台编译(交叉编译)
- 大多数情况下go的工具链能自动处理大多数编译和优化任务,这个只在非常特殊的情况下使用
- -buildmode: 指定编译模式,控制生成的输出文件类型和格式,构建共享库、插件、或其他非标准二进制文件时有用,可以通过`go help buildmode`查看有哪些模式
- -buildvcs: go1.18版本引入,用于控制是否在构建过程中嵌入版本控制系统vcs信息,默认为true。在程序中使用`debug.ReadBuildInfo()`查看
- modified: 是否有未提交的更改
- time: 提交的时间
- 不希望引入可以显示设置取消: go build -buildvcs=false
- -compiler: 指定当前编译器的名称,值为 gc 或者 gccgo。
- -gccgoflags: 指定需要传递给gccgo编译器或者连接器的标记的列表
- -gcflags: 指定需要传递给 go tool compile命令的标记的列表
- -installsuffix: 用于指定一个后缀字符串,附加到go编译器生成的中间文件和目标文件路径中。主要用途是避免在不同构建配置之间发生文件冲突
- -json: json格式输出
- -ldflags: 向连接器传递标志,设置某个变量的值
- go build -ldflags="-X main.Version=1.0.0 -X pkg/version.Branch=dev" 打包时设置变量值
- -linkshared: 构建过程中连接到共享库
- -mod: 指定模块模式
- readonly: 确保依赖都已经正确下载到模块缓存中。如果发现go.mod文件和依赖项缺失或不一致,工具链会报错
- vendor: 使用vendor目录中的依赖项进行构建
- mod: 自动更新go.mod和go.sum
- -modcacherw: 用于控制模块缓存(Module Cache)目录的读写权限
- -modfile: 指定代替go.mod的文件, 允许在构建过程中使用不同的模块配置文件
- go mod init -modfile go.dev.mod xxx 使用go.dev.mod进行初始化
- go get -modfile go.dev.mod xxx 使用go.dev.mod拉取指定包
- go build -modfile go.dev.mod: 使用go.dev.mod替代go.mod进行打包
- -overlay: 指定一个覆盖文件,动态替换或修改构建过程中使用的源文件
- -pgo: 1.20版本引入,通过程序运行时收集到的性能数据,将数据反馈给编译器,从而生成高效的二进制文件
- -pkgdir: 编译器会从该参数指定的目录中加载代码包的归档文件,会把编译可能生成的代码包归档文件放置在这个目录下
- -tags: 指定在实际编译期间需要受理的编译标签, 需要和`.go`文件中的 // +build 配合使用
- 查看 `go/build` 文档获得更多的编译标签的信息
- -trimpath: 从生成的二进制文件中移除与构建路径相关的信息,目的是提高构建结果的可移植性和安全性
- -toolexec: 自定义在编译期间使用一些go语言自带工具
## go clean
删除执行其他命令是产生的文件和目录, 其他参数信息请查看go build
参数
- -i: 删除当前文件中生成的文件
- -r: 递归清除当前模块或项目及其依赖的构建缓存和生成的文件。
- -n: 只打印,不执行
- -cache: 删除go build缓存
- -testcache: 清除缓存测试(go的测试工具会缓存测试结果,避免重复运行相同的测试用例。)
- -modcache: 清除依赖模块
- -fuzzcache: 清除与模糊测试(Fuzzing)相关的缓存数据, 自动化测试技术
## go doc
从代码注释中生成文档,并以简介的方式展示给用户, 可以使用`godoc`替换, 和 go tool doc 一样
- -all: 显示包中所有的导出符号(包括变量、函数、类型等)以及非导出符号。
- -c: 仅显示常量(constants)的文档
- -cmd: 当你想查看某个包中定义的命令(通常是 main 包中的可执行程序)时使用。
- -short: 仅显示简短的文档描述(通常是第一段注释)
- -src: 显示符号的源代码
- -u: 显示未导出(unexported)符号的文档
## go env
打印go环境变量
- -json 使用json格式输出环境变量信息
- -u 取消设置环境变量, 1.17版本引入
- -w 设置环境变量值
- go env -w GOPROXY=https://goproxy.cn,direct
## go fix
把指定代码包的所有旧版本代码修正为新版本代码。 和 go tool fix 一致, 不会用, 没成功过
- -go: go版本校验
- go tool fix -go="go1.24.2"
## go fmt
格式化代码, 使用gofmt执行命令
- -n 打印命令但不执行
- -x 执行并打印命令
## go generate
生产代码
## go get
拉取依赖模块, 其他参数信息请查看 go build
- -t 让命令程序同时下载并安装指定的代码包中的测试源码文件中依赖的代码包。
- -u 让命令利用网络来更新已有代码包及其依赖包。
## go install
编译和安装包和依赖项, 其他参数信息请查看 go build
## go list
列出包和模块, 其他参数信息请查看 go build
- -e 当包含有不完整的代码包,命令也不会提示错误
## go mod
模块维护
- 公共参数
- -x 打印执行命令
- -json json格式输出
- -modfile
- go mod download: 下载go.mod文件中指明的所有依赖
- -reuse=old.json
- go mod edit:通过工具修改go.mod文件
- -fmt
- -print: 输出go.mod文件内容
- -require=path@version: 使用go get同等替换
- -go=version: 设置go版本
- -exclude=path@version
- -replace=old[@v]=new[@v] 替换版本
- -dropreplace=old[@v]、 -tool=path、-godebug=key=value、-dropgodebug=key、 -droprequired=path、 -toolchain=version、 -dropexclude=path@version、-droptool=path
- go mod graph:查看模块之间的依赖关系
- go mod init:在当前目录中初始化模块
- go mod tidy:添加缺失模块或删除未使用模块
- go mod vendor:下载依赖模块到当前目录vendor中
- go mod verify:验证当前模块的依赖是否被篡改或损坏
- go mod why:查看为什么会用到对应的依赖
## go work
1.18版本引入, 工作区维护
- go work init: 初始化工作区
- go work edit: 修改工作区文件
- go work sync: 将工作区的依赖更新到模块中
- 如果工作区中模块1新增了模块2的依赖,使用此命令会更新模块1/go.mod文件,添加对模块2的依赖
- go work use: 工作区添加模块
- go work vendor: 将依赖下载到当前文件夹的Vendor
## go run
编译运行程序, 参数信息参考go build
## go telemetry
收集和go工具链程序有关性能和使用情况,上传到 telemetry.go.dev 帮助go团队改进go语言及其工具
## go test
编译运行test程序, 参数信息参考go build
## go tool
调用src/cmd中被编译安装的包
## go version
打印go版本信息