Go build tag 实现条件编译

发布时间: 2022-05-29 17:21:32 作者: 大象笔记

今天遇到了需要使用条件编译的场景,于是查了一下 golang 是如何支持条件编译的。

条件编译简介

go 文档里称之为,Build Constraints,即,编译限制。 也称为 build tag。

//go:build tag_name

其决定了当前文件是否会被当前 package 所包含。

重点:

用于限制一整个文件是否应该被编译入最终的二进制文件,而不是一个文件中的部分代码片段 (block)

build tag 的一些使用场景

低版本兼容场景示例

例如,我之前就看到 gin 框架下有个 any.go 文件,由于 any 是 go 1.18 引入的别名, 所以其对低版本的兼容处理就是通过 build tag 实现的。

// Copyright 2022 Gin Core Team. All rights reserved.
// Use of this source code is governed by a MIT style
// license that can be found in the LICENSE file.

//go:build !go1.18
// +build !go1.18

package gin

type any = interface{}

使用方法

例如 pro.go 在 main.go 的基础上新增了两个收费版功能:

//go:build pro

package main

func init() {
  features = append(features,
    "Pro 功能 #1",
    "Pro 功能 #2",
  )
}

编译时,加参数

go build -tags pro

go:build 与 +build 的区别

//go:build

是 Go 1.17 中引入的新条件编译指令格式。它旨在替换

// +build

指令。为何要采用新的格式呢?

对比一下新旧格式的区别就知道了:

//go:build linux && amd64 || darwin
// +build linux,amd64 darwin

显而易见的优势:

实战案例

go build tag 实现开发环境与生产环境采用不同的 embed.FS 策略

参考

我是一名山东烟台的开发者,联系作者