条件编译

概述 #

条件编译 是指针对不同的平台,在编译期间选择性地编译特定的程序代码。 Go 通过引入 build tag 实现了条件编译。

例子 #

条件编译 一个常见的场景是: 针对同一个方法,在不同的环境中 (开发|测试|生产),希望能输出不同等级的日志。

下面通过一个小例子来演示刚才描述的这种场景。

go.mod #

$ cat go.mod

# 输出如下
module helloworld

go 1.19

foo 包 #

新建一个 foo 目录,并在目录下面建立 3 个文件: debug.go, prod.go, main.go

debug.go #

将如下代码写入 debug.go 文件中。

//go:build debug

package foo

func Mode() {
	println("Debug Mode")
}

prod.go #

将如下代码写入 prod.go 文件中。

//go:build !debug

package foo

func Mode() {
	println("Production Mode")
}

main.go #

将如下代码写入 main.go 文件中。

package main

import "helloworld/foo"

func main() {
	foo.Mode()
}

通过 tags 运行 #

debug.goprod.go 两个文件中都有一个 Mode 方法,具体以哪个为准,需要编译时指定标签。通过指定不同的标签,运行程序可以得到不同的结果。

$ go run main.go
# 输出如下 
Production Mode

$ go run -tags debug main.go
# 输出如下
Debug Mode

多个编译条件 #

一个源文件中可以有多个 build tags,同一行的逗号隔开的 tag 之间是 逻辑与 的关系,空格隔开的 tag 之间是 逻辑或 的关系, 不同行之间的 tag逻辑与 的关系。

示例 #

# 逻辑或,此源文件只能在 linux 或者 darwin 平台下编译
// +build linux darwin

# 逻辑与,此源文件只能在 linux/amd64 平台下编译
// +build amd64
// +build linux

# 此源文件只能在 linux/386 或者 darwin 平台下编译
// +build linux,386 darwin

小结 #

示例演示了通过 条件编译 运行代码,构建的方式也是一样的,只是将 go run 换成 go build 即可。 通过 条件编译,可以在构建服务时非常灵活地指定具体的环境、版本、部署方式等参数,真正做到 一套代码,随地编译和运行

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。

© 蛮荆 | 陕公网安备 61011302001681 号 | 陕ICP备2023004378号-1 | Rendered by Hugo