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