Go的常用命令
Go的命令格式为:go command [args]
其中command为go的子命令,args为子命令的选项
可以使用go help command来查看指定子命令的帮助信息
常用子命令
build: 编译包和依赖
clean: 移除对象文件
go clean -modcache:清除所有下载的模块
env: 打印go的环境信息
bug: 启动错误报告
fmt: 运行gofmt进行格式化
get: 下载并安装包和依赖
install: 编译并安装包和依赖
list: 列出包
mod:用于管理go程序依赖
run: 编译并运行go程序
test: 运行测试
version: 显示go的版本
go run 编译并运行go程序(不会产生中间文件)
go clean [go_file] :删除指定go文件对应的编译生成的所有文件,不指定go文件时会删除当前目录下所有编译文件
go fmt go_file:会按照Go的要求格式化指定文件的代码格式
build命令用来编译go程序生成可执行文件的
go build [-o out_file] [build flags] [packages]
可以指定多个go文件,会将所有文件视为指定单个包的源文件列表,忽略以“_test.go”结尾的文件
但需要注意的是要生成可执行文件,需要满足两个条件:1、该程序属于main包;2、必须包含main函数
常用选项:
-C dir :设定程序运行根目录,该标记必须为所有选项中的第一个 -a :强制重新编译(默认编译后go文件没有更改不会重新编译) -n :打印编译过程中执行的命令但不执行它们 -x :打印编译过程中执行的命令且执行它们 -p n :编译时的并行数量,默认为GOMAXPROCS,通常为可用CPU数量 -race :开启数据竞争检测,仅在linux/amd64, freebsd/amd64, darwin/amd64, darwin/arm64, windows/amd64, linux/ppc64le and linux/arm64上支持 -cover :启用代码覆盖率检测工具 -covermode val:设置覆盖率分析的模式 如果启用了-race默认为"atomic",否则为"set",可选值 set :分析该语句是否运行了 count :分析该语句运行了多少次 atomic :在多线程中分析该语句运行了多少次,提供了更准确的计数,但成本更高 -coverpkg pattern1,pattern2,pattern3 设置指定包的代码进行覆盖率分析 默认情况下仅针对main主包进行分析,该选项可以执行分析其他的包 -v:在编译时打印包的名称 -work :打印临时工作目录的名称并且编译完成后不要删除它们 -asmflags '[pattern=]arg-list' :在编译中每次调用go tool asm命令时传递的参数 -buildmode=type:指定要编译的类型,常见的type有 archive:将所有非主包(非main包)构建到 .a 文件中 c-archive:构建列出的主包和它导入的所有包,仅供C调用 c-shared:构建列出的主包和它导入的所有包,dll文件,可供多种语言调用 default:主要包括编译成可执行文件,非主要包编译成.a文件 shared :编译为使用-linkshared选项时链接的共享库 exe:构建列出的主包及其导入的所有内容为可执行文件,未命名为 main 的包将被忽略 plugin:构建列出的主要包,以及它们的所有包导入到 Go 插件中,未命名为 main 的包将被忽略 -buildvcs val :编译时是否添加版本信息,可选true、false或auto(默认) -compiler name :指定编译器名称,可选gccgo或gc(默认) -installsuffix suffix :指定打包后的安装包目录名后缀,以便将输出与默认构建分开 -gccgoflags "args" : 用于向gccgo编译器传递额外的参数,常用选项 -O(优化级别) :-O0:不优化(默认,编译最快,但执行最慢) -O1:基本优化,减少代码大小 -O2:更高级的优化,通常推荐使用 -O3:最高级别优化,可能会增加编译时间 -Os:优化代码大小(适用于嵌入式或小型二进制文件) -g(调试信息) :-g:包含调试信息,可用于 gdb 调试 -g0:不包含调试信息(默认) -ggdb:包含 gdb 兼容的调试信息 -march=(架构优化):-march=native:针对本机CPU进行优化 -mtune=native:调整代码以适应当前 CPU,但仍兼容其他架构 -march=armv8-a:针对ARM v8指令集优化 -march=x86-64:针对 x86-64 架构优化 -gcflags "all=args" :用于向gc编译器传递额外的参数,常用选项 -N / -l :禁用优化,确保变量不会因优化而被优化掉或难以跟踪,主要用于调试 -N:禁止优化,使得调试器(如 delve)更容易解析变量和代码结构 -l:禁止内联优化,防止函数被内联,以便更容易调试 -m :查看内存分配优化信息,帮助分析是否有逃逸 -m -m(重复 -m)会提供更详细的逃逸分析信息 -S :查看生成的汇编指令,帮助进行底层优化或理解 Go 代码的底层实现 -L :查看哪些函数被编译器自动内联,以优化代码性能 -c=N :设置优化编译的次数,N是一个整数,默认为1,会影响编译时间和最终的优化效果 -ldflags args:在每次go tool link的调用中需要传递的参数 为一个双引号包含的字符串 -w:去掉DWARF调试信息,得到的程序就不能使用gdb调试了 -s:去掉符号表,程序运行错误时的提示信息没有任何文件名和行号信息 -X:设置编译文件的信息,如版本号,作者,更新时间等 go build -ldflags "-w -s -X main.Version=0.1.2 -X main.Uptime=${uptime}" 使用${变量}的形式可以使用go程序中的变量 -H 设置头类型 -H windowsgui或-H=windowsgui指示该程序为gui程序,不显示cmd命令窗口 -linkshared :构建代码,这些代码将被链接到之前使用 -buildmode=shared 选项创建的共享库 -mod mode :使用的模块下载模式:readonly, vendor, or mod 存在vendor目录且go.mod中指定的Go版本不低于1.14,默认使用vendor 否则默认为readonly -modcacherw:将新创建的目录在模块缓存中设置为读写权限,而不是只读权限 -modfile file :读取(以及可能写入)一个替代的go.mod文件而忽略根目录中的go.mod文件 也会在指定的go.mod文件目录中生成一个go.sum 文件 -overlay file 读取一个JSON配置文件,该文件为构建操作提供了一个覆盖层 该文件其中包含一个名为“Replace”的单一字段 当通过go run和go test运行或测试程序时,不会显示覆盖层 -pgo file 指定用于配置文件指导优化(PGO)的配置文件路径 当指定为“auto”时,对于构建的每个主包,会在包的目录中查找名为“default.pgo”的文件(如果该文件存在),并将其应用于主包的(传递性)依赖项(其他包不受影响) 特殊名称“off”会关闭PGO。默认值为“auto” -pkgdir dir:制定编译后程序加载包的目录名 -tags tag,list:由逗号分隔的构建标签列表,这些标签在构建过程中会根据条件来决定是否编译该文件 -trimpath :从生成的可执行文件中移除所有文件系统路径,记录的文件名路径开始为模块路径@版本或者普通导入路径
-tags tag,list:由逗号分隔的构建标签列表,这些标签在构建过程中会根据条件来决定是否编译该文件
构建标签指定需要在文件的开头部分进行编写,用于指定一些编译条件,当满足这些条件时才会编译该文件
构建标签://go:build name
//go:build name package main ......
name的可用值可以为一些预定义的特殊值,也可以是自定义的值
常用的预定义值 cgo :只有启用cgo时才会编译 windows、darwin、linux等 :只有在指定操作系统时才编译,Go环境变量中的GOOS值 amd64、arm64、386等 :只有在指定的操作系统架构才编译,Go环境变量中的GOARCH值 操作系统和架构可以使用go tool dist list命令查看完整的支持名录 gc、gccgo:只有在使用指定编译器时才编译 gox.y :只有在Go版本为指定版本时才编译,如go1.22
自定义值
//go:build mydiy,当使用了-tags mydiy选项时才会编译该文件
可以使用括号和逻辑运算
&& 逻辑与 || 逻辑或 ! 逻辑非 //go:build (linux && 386) || (darwin && !cgo) 目标系统是386的linux或者没有启用cgo的darwin时才会编译该文件
通过文件名指定构建标签
当文件名是以某种特定后缀的格式时,会默认解析为构建标签
特殊的可识别的文件名格式 *_GOOS.go *_GOARCH.go *_GOOS_GOARCH.go 如文件名source_windows_amd64.go,当目标系统是windows系统amd64架构时会编译