我在Go 1中遇到条件编译问题.
这是我的测试代码.有什么我误解了"// + build"约束和"-tags"标志吗?
main1.go
// +build main1
package main
import (
"fmt"
)
func main() {
fmt.Println("This is main 1")
}
Run Code Online (Sandbox Code Playgroud)
main2.go
// +build main2
package main
import (
"fmt"
)
func main() {
fmt.Println("This is main 2")
}
Run Code Online (Sandbox Code Playgroud)
当运行"go build"时,我仍然遇到编译错误
$ go build -tags 'main1'
# test
./main2.go:8: main redeclared in this block
previous declaration at ./main1.go:8
Run Code Online (Sandbox Code Playgroud)
bla*_*een 19
该// +build标签在 Go 1.17 之前使用,后面必须跟一个空行:
// +build main1
package main
Run Code Online (Sandbox Code Playgroud)
从 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 |
| 和 | // +build foo,bar |
//go:build foo && bar |
| 不(不变) | // +build !foo |
//go:build !foo |
更复杂的布尔表达式可以使用括号,而之前需要多行注释:
从:
// +build foo bar
// +build 386
Run Code Online (Sandbox Code Playgroud)
到:
//go:build (foo || bar) && 386
Run Code Online (Sandbox Code Playgroud)
此外,对于//go:build,现在不允许在多行上使用多个指令。
go fmt使用指令在源文件上运行// +build将自动添加匹配的//go:build文件。
在错误位置使用指令运行go fmt源文件将自动修复它。//go:build所以现在你的问题只需运行即可解决gofmt -w main.go
来源:Go 1.17 构建约束草案设计。(即使 Go 1.17 正式发布,目前仍是草案)
pet*_*rSO 12
建立约束
构建约束是以指令开头的行注释,该指令
+build列出了文件应包含在包中的条件.约束可能出现在任何类型的源文件中(不仅仅是Go),但它们必须出现在文件顶部附近,前面只有空白行和其他行注释.要将构建约束与包文档区分开来,必须在一系列构建约束后面加一个空行.
在构建约束之后添加一个空行.例如,
// +build main1
package main
import (
"fmt"
)
func main() {
fmt.Println("This is main 1")
}
Run Code Online (Sandbox Code Playgroud)