[TOC]
交叉编译
交叉编译
通过go env GOARCH
可获取到当前平台的架构。一般有 amd64,386,
mac上编译linux和windows二进制
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=linux GOARCH=386 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
linux上编译mac和windows二进制
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
windows上编译mac和linux二进制
SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go
SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go
编译选项
详细说明可以通过go tool compile -h
和 go tool link -h
查看。
参数
-o
可执行文件名字 (默认与目录同名)
-a
强制重新编译所有包(含标准库)
-p
并行编译
-v
显示待编译包名字
-n
仅显示编译命令,但不执行
-x
显示正在执行的编译命令
-work
显示临时工作目录,完成后不删除
-race
启动数据竞争检查
-gcflags
编译器参数
-ldflags
链接器参数
ldflags
-w
去掉DRAWF调试信息
-s
去掉符号表
-X
设置字符串全局变量值 -X ver=“0.99”
-H
设置可执行文件格式 -H windowsgui
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags “-w -s” 可以极大的减小包体积。适合线上用。
gcflags
-B
禁用越界检查
-N
禁用优化
-l
禁用内联
-u
禁用unsafe
-S
输出汇编代码
-m
输出优化信息
go build -gcflags "-l -m"
-l # 禁用函数内联
-m # 输出优化信息。
GDB debug时,建议 使用 go build -gcflags "-N -l"
发布时,建议使用 go build -gcflags "-m" -ldflags "-w -s" #可降低文件大小 使用upx 可进一步瘦身。
go get
参数说明
-d
仅下载,不安装
-u
更新包,包括其依赖项
-f
和-u
配合,强制更新,不检查是否过期
-t
下载测试代码所需要依赖包
-insecure
使用HTTP等非安全协议
-v
输出详细信息
-x
显示正在执行的命令。
条件编译
build tag
build tag
是在Go或cgo环境下的C/C++文件开头的一种特殊的注释。
比如下面的源文件只有在设置debug (平台是linux/darwin)构建标志时才会被构建:
// +build debug
// +build debug linux darwin # 空格表示或,逗号表示且。
package main
var buildMode = "debug"
利用tags
可以为go的二进制生成版本信息。参考https://www.cnblogs.com/linyihai/p/10859945.html
基于文件名
将平台和架构信息添加到主文件名尾部。
如 hello_darwin.go
hello_linux.go
这样不同的系统就会编译不同的文件。
标准库就是这么干的.
$ ls /usr/local/go/src/runtime/sys_*
/usr/local/go/src/runtime/sys_aix_ppc64.s /usr/local/go/src/runtime/sys_freebsd_arm64.s /usr/local/go/src/runtime/sys_mips64x.go /usr/local/go/src/runtime/sys_openbsd_386.s /usr/local/go/src/runtime/sys_solaris_amd64.s
/usr/local/go/src/runtime/sys_arm.go /usr/local/go/src/runtime/sys_libc.go /usr/local/go/src/runtime/sys_mipsx.go /usr/local/go/src/runtime/sys_openbsd_amd64.s /usr/local/go/src/runtime/sys_wasm.go
/usr/local/go/src/runtime/sys_arm64.go /usr/local/go/src/runtime/sys_linux_386.s /usr/local/go/src/runtime/sys_netbsd_386.s /usr/local/go/src/runtime/sys_openbsd_arm.s /usr/local/go/src/runtime/sys_wasm.s
/usr/local/go/src/runtime/sys_darwin.go /usr/local/go/src/runtime/sys_linux_amd64.s /usr/local/go/src/runtime/sys_netbsd_amd64.s /usr/local/go/src/runtime/sys_openbsd_arm64.s /usr/local/go/src/runtime/sys_windows_386.s
/usr/local/go/src/runtime/sys_darwin_amd64.s /usr/local/go/src/runtime/sys_linux_arm.s /usr/local/go/src/runtime/sys_netbsd_arm.s /usr/local/go/src/runtime/sys_openbsd_mips64.s /usr/local/go/src/runtime/sys_windows_amd64.s
/usr/local/go/src/runtime/sys_darwin_arm64.go /usr/local/go/src/runtime/sys_linux_arm64.s /usr/local/go/src/runtime/sys_netbsd_arm64.s /usr/local/go/src/runtime/sys_plan9_386.s /usr/local/go/src/runtime/sys_windows_arm.s
/usr/local/go/src/runtime/sys_darwin_arm64.s /usr/local/go/src/runtime/sys_linux_mips64x.s /usr/local/go/src/runtime/sys_nonppc64x.go /usr/local/go/src/runtime/sys_plan9_amd64.s /usr/local/go/src/runtime/sys_x86.go
/usr/local/go/src/runtime/sys_dragonfly_amd64.s /usr/local/go/src/runtime/sys_linux_mipsx.s /usr/local/go/src/runtime/sys_openbsd.go /usr/local/go/src/runtime/sys_plan9_arm.s
/usr/local/go/src/runtime/sys_freebsd_386.s /usr/local/go/src/runtime/sys_linux_ppc64x.s /usr/local/go/src/runtime/sys_openbsd1.go /usr/local/go/src/runtime/sys_ppc64x.go
/usr/local/go/src/runtime/sys_freebsd_amd64.s /usr/local/go/src/runtime/sys_linux_riscv64.s /usr/local/go/src/runtime/sys_openbsd2.go /usr/local/go/src/runtime/sys_riscv64.go
/usr/local/go/src/runtime/sys_freebsd_arm.s /usr/local/go/src/runtime/sys_linux_s390x.s /usr/local/go/src/runtime/sys_openbsd3.go /usr/local/go/src/runtime/sys_s390x.go
# 预处理
自动生成代码。
用go generate
命令扫描源码文件,找出所有"go:generate"注释,提取其中的命令并执行。
- 命令必须放在.go源文件中
- 命令必须以"//go:generate" 开头
- 每个文件可以有多条generate命令。
- 命令支持环境变量
- 必须显示执行 go generate命令。
- 按文件名顺序提取命令并执行。
- 串行执行,出错后终止后续命令的执行。