Go

Go

大道至简。Go 语言千秋万载、一统江湖!

特点:(默认配置下)编译结果是静态链接后的单个可执行文件,没有任何外部依赖,部署和维护非常方便。

“没有外部依赖”说明:

  • Linux : 默认 Go 编译出的 Linux elf 直接使用 syscall,连 libc 都不依赖。
  • Windows : Go 编译出的 Windows PE 仅依赖 Windows 的系统库dll,因为 Windows 的 syscall ABI 不是稳定的,各个版本直接经常变动。

Install

Manual

wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.20.6.linux-amd64.tar.gz

在 .bash_profile , .bashrc 或 /etc/profile 里增加环境变量设置:

export PATH=/usr/local/go/bin:$PATH
#export GOROOT=/usr/local/go # optional

Tips

CLI

go env GOPATH
go env GOROOT
go build

Cross Compile

1.5版以后的 Go 交叉编译非常简单,只需在 build 前设置 GOARCH 和 GOOS 两个环境变量即可

Compile Linux amd64 bin from Windows

set GOARCH=amd64
set GOOS=linux
go build

如果构建目标为 mipsle 的 soft-float 设备,额外加上 GOMIPS=softfloat

GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build

GOARCH 架构:

  • mipsle : MIPS, 小尾序。大部分 MIPS SOC 的路由器(例如 MT7621) 都是 mipsle 这种。注意 mips / mipsle 在 Linux 的 file 工具显示结果没有区别,都是 "ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked" 这种。
  • mips : MIPS, 大尾序。消费级设备很少用这种SOC。
  • amd64
  • arm64

构建生产环境(stripped):

go build -ldflags "-s -w"

生成的二进制文件体积能减少 1/3 左右。

Compress binary

可以使用 upx 压缩 Go 生成的二进制可执行文件大小。

upx --best executable_file

upx 工具本身完全跨平台,任何平台的 upx CLI 都支持压缩 Windows PE / Linux ELF 等所有平台的可执行文件。测试能将 Go 1.21 构建的可执行文件压缩到 1/3 左右(而且是在 go build -ldflags "-s -w" 的基础上)。

其它方法:

  • tinygo : 测试 Go 1.21 项目构建失败(2023-12)。

参考资料:

vet

go vet .

shadow

需要安装 shadow 这个包

go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest

安装后用注册全局 shadow 这个 binary。

然后

shadow . 
# or
go vet -vettool="C:\Users\root\go\bin\shadow.exe" .

goreleaser

go install github.com/goreleaser/goreleaser@latest

CI / CD

建议使用 goreleaser

配合 CI / CD 使用时非常简单,只需要 Linux 环境,然后在代码仓库根目录执行:

curl -sfL https://goreleaser.com/static/run |
   bash -s -- release --snapshot --clean

构建结果: dist/*.zip

支持 Go 的免费托管 CI / CD 服务

  • AppVeyor : 只支持构建 public 仓库。支持 Github。

gvm (go 版本管理)

AppVeyor 的 Linux 镜像预装了 gvm, 可以在 build 脚本里自己安装指定的 Go 版本:

gvm install go1.21.5 -B
gvm use go1.21.5

说明:

  • gvm install 必须指定 -B (install from binary) flag,否则默认编译源码安装,坑爹。

Last update: 2024-01-16 12:15:38 UTC