Golang条件编译

时间:2012-05-18 04:02:01

标签: go

我在Go 1中遇到条件编译问题。

这是我的测试代码。有什么我误解了“// + build”约束和“-tags”标志吗?

main1.go

// +build main1
package main

import (
    "fmt"
)

func main() {
    fmt.Println("This is main 1")
}

main2.go

// +build main2
package main

import (
    "fmt"
)

func main() {
    fmt.Println("This is main 2")
}

运行“go build”时,我仍然遇到编译错误

$ go build -tags 'main1'
# test
./main2.go:8: main redeclared in this block
        previous declaration at ./main1.go:8

5 个答案:

答案 0 :(得分:66)

您必须使用空行跟随// +build XXX

在我的简短搜索中,我无法找到记录的位置。但是the source清楚地说出来了

答案 1 :(得分:12)

是的,你必须留下一个空白行,不是在// +build XXX之后,而是在package main之前,因为声明包的行之前的所有注释行都被认为是包的描述并被解析为godoc

答案 2 :(得分:12)

  

Package build

     

构建约束

     

构建约束是以该指令开头的行注释   +build列出了文件的条件   包括在内。约束可能出现在任何类型的来源中   文件(不仅仅是Go),但它们必须出现在文件顶部附近,   前面只有空白行和其他行注释。

     

要区分构建约束和包文档,一系列   构建约束必须后跟一个空行。

在构建约束后添加一个空行。例如,

// +build main1

package main

import (
    "fmt"
)

func main() {
    fmt.Println("This is main 1")
}

答案 3 :(得分:5)

http://golang.org/pkg/go/build/ 建立约束 “为了区分构建约束和包文档,一系列构建约束必须后跟一个空行。”

答案 4 :(得分:1)

从 Go 1.17 开始,条件构建标签将能够使用支持布尔表达式的 //go:build 行而不是旧的 // +build 行。

主要改进

  • //go:build 注释格式与其他 go 指令一致,如 //go:embed//go:generate//go:noinline
  • 构建标记之间布尔表达式的语法现已标准化,使用 &&|| 运算符

语法比较

<头>
表达 // +build //go:build
// +build foo bar(空格分隔) //go:build foo || bar
AND // +build foo,bar //go:build foo && bar
不是(不变) // +build !foo //go:build !foo

多行注释

更复杂的布尔表达式可以使用括号,而在它之前需要多行注释:

来自:

// +build foo bar
// +build 386

到:

//go:build (foo || bar) && 386

此外,使用 //go:build,现在不允许超过一行的多个指令。

自动格式化

此外,在带有 go fmt 指令的源文件上运行 // +build 将自动添加匹配的 //go:build 一个。

<块引用>

如果一个文件只包含 // +build 行,gofmt 会在它们上面添加一个等效的 //go:build 行。


来源:Go 1.17 build constraints design proposal。在撰写本文时,当前的 Go 1.17 已发布测试版。