2022-01-11 14:35:19

go工具链

[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 -hgo 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命令。
  • 按文件名顺序提取命令并执行。
  • 串行执行,出错后终止后续命令的执行。

本文链接:http://blog.go2live.cn/post/go-tools.html

-- EOF --