Golang条件编译

Tia*_*hen 45 go

我在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)

axw*_*axw 70

您必须// +build XXX使用空行.

在我的简短搜索中,我无法找到记录的位置.但消息来源明确表示了这一点

  • 它记录在http://golang.org/pkg/go/build/#hdr-Build_Constraints中.具体来说:"为了区分构建约束和包文档,一系列构建约束必须后跟一个空行." (6认同)

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 正式发布,目前仍是草案)


小智 12

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


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)


小智 5

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