有没有办法在 Go 中的构建时定义常量?
Is there a way to define a constant at build time in Go?
我有一个 Go 程序,我想编译成一堆二进制文件,每个二进制文件都有一个不同定义的 const
值。更清楚地说,我有类似的东西:
const wordLen = 6
type knowledge [wordLen]byte
在这里,wordLen
与值 6 相关联,但我想要不同的二进制文件,值范围从 5 到 10。我可以将其设为变量,然后使用切片而不是数组,但这会对我的软件产生巨大的性能影响(是的,我试过了)。
我希望在 go build
参数上有一些构建标记,以指示给定二进制文件的 wordLen
的值是什么。那么,执行此操作的(尽可能惯用的)方法是什么?
是的,这可以使用 Build Constraints。
您可以使用 -tags
标志向 go build
提供这些约束的列表。
示例:
main.go
package main
import "fmt"
func main() {
fmt.Println(f)
}
foo.go
// +build foo
package main
const f = "defined in foo.go"
bar.go
// +build bar
package main
const f = "defined in bar.go"
用不同的标签编译代码会得到不同的结果:
$ go build -tags foo
$ ./main
defined in foo.go
$ go build -tags bar
$ ./main
defined in bar.go
它并没有解决你的确切问题,但它可能会解决其他问题所以我补充说你可以使用 go 编译器的 -ldflags
选项:
go build -ldflags "-X main.wordLen=6"
然而它有两个缺点:
- 仅适用于字符串
- 仅适用于变量
我有一个 Go 程序,我想编译成一堆二进制文件,每个二进制文件都有一个不同定义的 const
值。更清楚地说,我有类似的东西:
const wordLen = 6
type knowledge [wordLen]byte
在这里,wordLen
与值 6 相关联,但我想要不同的二进制文件,值范围从 5 到 10。我可以将其设为变量,然后使用切片而不是数组,但这会对我的软件产生巨大的性能影响(是的,我试过了)。
我希望在 go build
参数上有一些构建标记,以指示给定二进制文件的 wordLen
的值是什么。那么,执行此操作的(尽可能惯用的)方法是什么?
是的,这可以使用 Build Constraints。
您可以使用 -tags
标志向 go build
提供这些约束的列表。
示例:
main.go
package main
import "fmt"
func main() {
fmt.Println(f)
}
foo.go
// +build foo
package main
const f = "defined in foo.go"
bar.go
// +build bar
package main
const f = "defined in bar.go"
用不同的标签编译代码会得到不同的结果:
$ go build -tags foo
$ ./main
defined in foo.go
$ go build -tags bar
$ ./main
defined in bar.go
它并没有解决你的确切问题,但它可能会解决其他问题所以我补充说你可以使用 go 编译器的 -ldflags
选项:
go build -ldflags "-X main.wordLen=6"
然而它有两个缺点:
- 仅适用于字符串
- 仅适用于变量