Go高级构建指南

本文将探索Golang高级构建技巧,从而有助于创建更高效的二进制文件。原文: Advanced Go Build Techniques

构建选项

以下是 go build 命令最常用的一些选项:

  • -o: 指定输出文件名。默认输出文件名是主软件包的名称,在 Windows 系统中会自动添加 .exe 后缀。
  • -v: 详细输出。该选项会在编译时打印软件包的名称。
  • -work: 打印临时工作目录,退出时不删除。该选项对调试很有用。
  • -x: 打印指令。该选项可打印 go build 正在执行的指令。
  • -asmflags: 传递给 go tool asm 调用的参数。
  • -buildmode: 要使用的编译模式。默认构建模式为 exe。其他可能的值包括sharedpieplugin
  • -buildvcs: 是否在二进制文件中加入版本控制信息。默认值为auto(自动)。

有关 go build 命令的更多信息,可以运行以下命令:

bash 复制代码
go help build

包含哪些文件

在 Go 中使用 go build 命令时,会编译当前目录及其子目录中的 Go 源文件,以创建可执行的二进制文件。默认情况下只编译 .go 文件,而忽略目录中的其他文件类型。不过,值得注意的是,go build 命令的行为可能会受到构建标签和构建约束的影响。

go build 通常会忽略以下类型的文件:

1.扩展名不是 .go 的文件:

目录中任何没有 .go 扩展名的文件都将被忽略,包括文本文件、配置文件、图片等。

2.子目录中的文件:

go build 命令编译当前目录及其子目录中所有 .go 文件,其他文件和目录通常会被忽略。

3.以下划线或点号开头的文件:

go 工具会忽略以 ._ 开头的目录和文件名,以及名为 testdata 的目录。

4.被构建约束排除的文件:

Go 支持构建约束,允许根据目标操作系统或体系架构等条件,构建过程中包含或排除特定文件。例如,在为非 Windows 平台构建时,带有 //go:build windows 等构建约束的文件将被忽略。

5.通过构建标签排除的文件:

构建标签是 Go 源文件中的特殊注释,可用于根据自定义条件指定哪些文件应包含在编译中。如果文件的构建标记与构建上下文不匹配,则会被忽略。

6."testdata"目录中的文件:

testdata 的目录中的文件将被忽略。该目录通常用于包含与测试相关的数据,而这些数据并不需要编译。

构建标签

Go 的构建标签提供了一种强大的机制,可在构建过程中包含或排除特定代码。通过使用构建标签,开发人员可以定制自己的应用程序,使其适用于不同的构建配置、环境或特定平台要求。这一功能在处理交叉编译或为特定操作系统创建二进制文件时尤为重要。

构建标签是放在 Go 源文件开头的注释,指定了一组条件,标识在这些条件下,该文件中的代码应被包含或排除在联编过程之外。语法是 //go:build 。例如,考虑这样一种情况:只有在为应用程序的某个版本构建时,才会包含一段特定的代码:

main.go

golang 复制代码
package mainimport "fmt"

var version string
func main() {
    fmt.Println(version)
}

pro.go

golang 复制代码
//go:build pro
package main
func init() {
    version = "pro"
}

free.go

golang 复制代码
//go:build free
package main
func init() {
    version = "free"
}

当使用 -tags=free 时,输出将是 free,因为 free.go 文件已包含在内。而使用 -tags=pro 时,输出将是 pro

构建标签语法

可以像使用编程中的其他条件语句一样组合约束条件,如 AND、OR、NOT。

NOT

golang 复制代码
//go:build !cgo

只有在未启用 CGO 的情况下,才会在构建过程中包含该文件。

AND

golang 复制代码
//go:build cgo && darwin

只有启用 CGO 并且 GOOS 设置为 darwin 的情况下,才会在构建过程中包含该文件。

OR

golang 复制代码
//go:build darwin || linux

组合使用

golang 复制代码
//go:build (linux || 386) && (darwin || !cgo)

注意:1.16 及更早版本的 Go 使用了不同的构建约束语法,前缀为 // +build。当遇到旧语法时,gofmt 命令将添加等效的 //go:build 约束。

构建约束

除了使用构建参数设置自定义构建标签,golang 也会根据环境变量和其他因素自动设置一些标签。以下是可用标记的列表:

  1. GOOS 和 GOARCH 环境变量

可以在源代码中设置限制条件,只有在使用了特定 GOOS 或 GOARCH 时才能运行文件,例如:

golang 复制代码
//go:build darwin,amd64
package utils
  1. GO 版本限制

可以根据构建整个模块时使用的 go 版本来约束是否包含文件。例如,要只在使用 go 版本为 1.12 及以上时构建文件,可以使用 //go:build go1.18。如果 go 的版本是 1.18 或 1.21(截至本文撰写时的最新版本),则会包含该文件。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

本文由mdnice多平台发布

相关推荐
童先生4 小时前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
幼儿园老大*5 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
架构师那点事儿10 小时前
golang 用unsafe 无所畏惧,但使用不得到会panic
架构·go·掘金技术征文
于顾而言1 天前
【笔记】Go Coding In Go Way
后端·go
qq_172805591 天前
GIN 反向代理功能
后端·golang·go
follycat1 天前
2024强网杯Proxy
网络·学习·网络安全·go
OT.Ter1 天前
【力扣打卡系列】单调栈
算法·leetcode·职场和发展·go·单调栈
探索云原生2 天前
GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU
ai·云原生·kubernetes·go·gpu
OT.Ter2 天前
【力扣打卡系列】移动零(双指针)
算法·leetcode·职场和发展·go
码财小子2 天前
k8s 集群中 Golang pprof 工具的使用
后端·kubernetes·go