【问题标题】:Golang conditional compilationGolang 条件编译
【发布时间】:2012-05-18 04:02:01
【问题描述】:

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

【问题讨论】:

    标签: go build go-build


    【解决方案1】:

    // +build 标签,在 Go 1.17 之前使用,后面必须跟一个空行:

    // +build main1
    
    package main
    

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

    主要改进

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

    语法比较

    Expression // +build //go:build
    OR // +build foo bar (space-separated) //go:build foo || bar
    AND // +build foo,bar //go:build foo && bar
    NOT (unchanged) // +build !foo //go:build !foo

    多行 cmets

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

    发件人:

    // +build foo bar
    // +build 386
    

    到:

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

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

    自动格式化

    • 在带有// +build 指令的源文件上运行go fmt 将自动添加匹配的//go:build

    • 在带有//go:build 指令的源文件上运行go fmt 会自动修复它。所以现在你的问题只需运行gofmt -w main.go

      就可以解决

    来源:Go 1.17 build constraints draft design。 (即使 Go 1.17 正式发布,目前仍是草稿)

    【讨论】:

      【解决方案2】:

      您必须在// +build XXX 后面加上一个空行。

      在我的简短搜索中,我找不到记录在哪里/是否记录在案。但the source 明确指出

      【讨论】:

      【解决方案3】:

      Package build

      构建约束

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

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

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

      // +build main1
      
      package main
      
      import (
          "fmt"
      )
      
      func main() {
          fmt.Println("This is main 1")
      }
      

      【讨论】:

        【解决方案4】:

        来自Build Constraints 文档:

        为了将构建约束与包文档区分开来,一系列构建约束后面必须跟一个空行。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2016-12-21
            • 1970-01-01
            • 1970-01-01
            • 2016-07-17
            • 2010-11-15
            • 2023-03-05
            • 2013-07-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多