Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何正确使用构建标记?_Go_Build_Go Build - Fatal编程技术网

Go 如何正确使用构建标记?

Go 如何正确使用构建标记?,go,build,go-build,Go,Build,Go Build,我需要能够建立一个围棋应用程序的不同版本;“调试”版本和正常版本 这很容易做到;我只是有一个const调试,它控制应用程序的行为,但每次需要在构建类型之间交换时都必须编辑配置文件,这很烦人 我正在阅读go build()和标记,我想也许我可以这样做: config.go: // +build !debug package build const DEBUG = false config.debug.go: // +build debug package build const DEBUG =

我需要能够建立一个围棋应用程序的不同版本;“调试”版本和正常版本

这很容易做到;我只是有一个const调试,它控制应用程序的行为,但每次需要在构建类型之间交换时都必须编辑配置文件,这很烦人

我正在阅读go build()和标记,我想也许我可以这样做:

config.go:

// +build !debug
package build
const DEBUG = false
config.debug.go:

// +build debug
package build
const DEBUG = true
然后我应该能够使用
go-build
go-build-tags-debug
,并且标记应该排除
config.go
并包括
config.debug.go

…但这不起作用。我得到:

src/build/config.go:3:DEBUG在此块中重新声明()上一个 src/build/config.debug.go上的声明:3

我做错了什么

我是否应该使用另一种更合适的#ifdef风格的方法来实现这一点?

请参阅。在
//+build
行之后需要一个空行


另外,您可能需要
在config.go中,而不是在config.debug.go中;假设您希望其中一个为“DEBUG=false”。

您可以使用编译时常量:如果您使用

go build -ldflags '-X main.DEBUG=YES' test.go
来自package main的变量
DEBUG
将设置为字符串“YES”。否则,它将保留其声明的内容

package main

import (
    "fmt"
)

var DEBUG = "NO"

func main() {
    fmt.Printf("DEBUG is %q\n", DEBUG)
}


编辑:自Go 1.6(?)起,开关为
-X main.DEBUG=YES
,在此之前为
-X main.DEBUG-YES
(无
=
)。感谢@poorva的评论。

从Go 1.17开始,可以使用新语法指定构建标记

至于
//go:build
指令的位置,新设计声明:

约束可能出现在任何类型的源文件中(不仅仅是Go),但它们必须出现在文件顶部附近,前面只有空行和其他
/
/**/
注释。这些规则意味着在Go文件中,生成约束必须出现在package子句之前

因此,您仍然需要在
//go:build
指令和package语句之间保留一个空行,否则它可以被解析为包文档,但是现在:

  • 编译器将拒绝放错位置的指令
  • 运行
    go-fmt
    将自动修复错误放置的指令
例如,运行
go fmt
on(无空行):

给出(带空行):



有关新语法的更改的更多详细信息,请参见。

是的,谢谢,这就是问题所在;编辑后的问题不那么愚蠢。它生成了,但仍然存在Golint错误。编辑:在重新启动VSCodium后解决。这对非字符串数据可能吗?@MattJoiner没有测试所有内容,但可以使用int。
//go:build foo
package main

import "fmt"

func main() {
    fmt.Println("Hello world")
}
//go:build foo

package main

import "fmt"

func main() {
    fmt.Println("Hello world")
}