本文将探索Golang高级构建技巧,从而有助于创建更高效的二进制文件。
构建选项
以下是 go build
命令最常用的一些选项:
-o
: 指定输出文件名。默认输出文件名是主软件包的名称,在 Windows 系统中会自动添加.exe
后缀。-v
: 详细输出。该选项会在编译时打印软件包的名称。-work
: 打印临时工作目录,退出时不删除。该选项对调试很有用。-x
: 打印指令。该选项可打印go build
正在执行的指令。-asmflags
: 传递给go tool asm
调用的参数。-buildmode
: 要使用的编译模式。默认构建模式为exe
。其他可能的值包括shared
、pie
和plugin
。-buildvcs
: 是否在二进制文件中加入版本控制信息。默认值为auto
(自动)。
有关 go build
命令的更多信息,可以运行以下命令:
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
package mainimport "fmt" var version string func main() { fmt.Println(version) }
pro.go
//go:build pro package main func init() { version = "pro" }
free.go
//go:build free package main func init() { version = "free" }
当使用 -tags=free
时,输出将是 free
,因为 free.go
文件已包含在内。而使用 -tags=pro
时,输出将是 pro
。
构建标签语法
可以像使用编程中的其他条件语句一样组合约束条件,如 AND、OR、NOT。
NOT
//go:build !cgo
只有在未启用 CGO 的情况下,才会在构建过程中包含该文件。
AND
//go:build cgo && darwin
只有启用 CGO 并且 GOOS 设置为 darwin 的情况下,才会在构建过程中包含该文件。
OR
//go:build darwin || linux
组合使用
//go:build (linux || 386) && (darwin || !cgo)
注意:1.16
及更早版本的 Go 使用了不同的构建约束语法,前缀为 // +build
。当遇到旧语法时,gofmt 命令将添加等效的 //go:build
约束。
构建约束
除了使用构建参数设置自定义构建标签,golang 也会根据环境变量和其他因素自动设置一些标签。以下是可用标记的列表:
- GOOS 和 GOARCH 环境变量
可以在源代码中设置限制条件,只有在使用了特定 GOOS 或 GOARCH 时才能运行文件,例如:
//go:build darwin,amd64 package utils
- GO 版本限制
可以根据构建整个模块时使用的 go 版本来约束是否包含文件。例如,要只在使用 go 版本为 1.12 及以上时构建文件,可以使用 //go:build go1.18
。如果 go 的版本是 1.18 或 1.21(截至本文撰写时的最新版本),则会包含该文件。
技术扩展延伸
只关注自己的一亩三分地,也是很难跳出程序员这个圈子的。前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。
介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。
这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。
看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~