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多平台发布

相关推荐
蒙娜丽宁2 天前
Go语言错误处理详解
ios·golang·go·xcode·go1.19
qq_172805593 天前
GO Govaluate
开发语言·后端·golang·go
littleschemer3 天前
Go缓存系统
缓存·go·cache·bigcache
程序者王大川4 天前
【GO开发】MacOS上搭建GO的基础环境-Hello World
开发语言·后端·macos·golang·go
Grassto4 天前
Gitlab 中几种不同的认证机制(Access Tokens,SSH Keys,Deploy Tokens,Deploy Keys)
go·ssh·gitlab·ci
高兴的才哥5 天前
kubevpn 教程
kubernetes·go·开发工具·telepresence·bridge to k8s
少林码僧5 天前
sqlx1.3.4版本的问题
go
蒙娜丽宁6 天前
Go语言结构体和元组全面解析
开发语言·后端·golang·go
蒙娜丽宁6 天前
深入解析Go语言的类型方法、接口与反射
java·开发语言·golang·go
三里清风_6 天前
Docker概述
运维·docker·容器·go