我在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
答案 0 :(得分:66)
您必须使用空行跟随// +build XXX
。
在我的简短搜索中,我无法找到记录的位置。但是the source清楚地说出来了
答案 1 :(得分:12)
是的,你必须留下一个空白行,不是在// +build XXX
之后,而是在package main
之前,因为声明包的行之前的所有注释行都被认为是包的描述并被解析为godoc
。
答案 2 :(得分:12)
构建约束
构建约束是以该指令开头的行注释
+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 已发布测试版。