Golang 大白话教程:第26课-掌握常用编译指令参数

发表时间: 2021-03-29 09:48

上一章节学习了 -ldflags -X 的用法,-lgflags 还有两个常用的参数:

1. -w 去掉调试信息

2. -s 去掉符号表

写一个什么都不干的 main.go 执行 go build -o=./main main.go && ls -lh main:

# go build -o=./main main.go && ls -lh main-rwxr-xr-x 1 wangbo staff 1.2M  1 20 11:02 main

它的大小是 1.2M,执行 go build -o=./main -ldflags "-w -s" main.go && ls -lh main:

# go build -o=./main -ldflags "-w -s" main.go && ls -lh main-rwxr-xr-x 1 wangbo staff 867K  1 20 11:05 main

其文件大小降低为 867K,如果需要对程序进行调试则需要保留调试信息和符号表,否则就去掉。


-x 显示编译连接的过程:

# go build -x main.goWORK=/var/folders/jw/rpyqrcvd6jb5w9v2lq0pnnpw0000gn/T/go-build057203084mkdir -p $WORK/b001/cat >$WORK/b001/importcfg.link << 'EOF' # internalpackagefile command-line-arguments=/Users/wangbo/Library/Caches/go-build/80/80b6c11eb8d8ea82f95ff2929da9bcb38270614499babfd758b10f0aa574f257-dpackagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.apackagefile internal/bytealg=/usr/local/go/pkg/darwin_amd64/internal/bytealg.apackagefile internal/cpu=/usr/local/go/pkg/darwin_amd64/internal/cpu.apackagefile runtime/internal/atomic=/usr/local/go/pkg/darwin_amd64/runtime/internal/atomic.apackagefile runtime/internal/math=/usr/local/go/pkg/darwin_amd64/runtime/internal/math.apackagefile runtime/internal/sys=/usr/local/go/pkg/darwin_amd64/runtime/internal/sys.aEOFmkdir -p $WORK/b001/exe/cd ./usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=VO2fnCWApwZeNGuGyqj0/FXrj_zykxVHTmNlCur6C/VM6QVuSfezjKBeyD8n26/VO2fnCWApwZeNGuGyqj0 -extld=clang /Users/wangbo/Library/Caches/go-build/80/80b6c11eb8d8ea82f95ff2929da9bcb38270614499babfd758b10f0aa574f257-d/usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/exe/a.out # internalmv $WORK/b001/exe/a.out mainrm -r $WORK/b001/


-a 强制重新构建,默认为了增加编译速度,没有改动的部分不会重新编译,-a 参数则忽略这些编译好的部分,全部重新编译,所以 -a 会比较慢。


系统内置的 // +build !linux 在非 linux 下包含该文件,而 // +build linux,amd64 darwin 在 linux amd64 和 macos 下包含该文件,自定义的 tag 可以通过 --tags 参数实现,通过 -tags 构建带特殊的版本,比如文件头 // +build sessredis 配合 -tags "sessredis" 则文件会包含进编译,表明使用 redis 实现 session 的版本,而 // +build !sessredis 的文件会排除,表明使用默认的 cookie 来实现 session 的版本,反之亦然。


go test -race 和 go build -race 参数可以检测竞争状态,静态分析程序是不是有隐含的竞争问题,可能会出 bug 的读写操作。go run -race main.go 运行下面的程序会收到 DATA RACE 报警:

package mainvar sum intfunc main()go add()  go add()}func add() {  sum++}  


-gcflags="-N -I" 禁止编译优化和内敛优化,对单独的函数可以标注 //go:noline 来设定不要内敛优化,//go:nosplit 跳过栈溢出检查,// go:noescape 禁止逃逸分析,//go:norace 跳过静态检查,在后面的反编译章节会用到这几个编译设定。


XX_$GOOS_$GOARCH.go 特定的平台和架构下包含该文件,比如 task_darwin_amd64.go、task_linux_amd64.go 等。


本章节的代码
https://github.com/developdeveloper/go-demo/tree/master/26-compile-switch