有没有办法在Go中的构建时定义常量?

时间:2016-03-22 10:02:01

标签: go const build-time

我在Go中有一个程序,我希望在一堆二进制文件中编译,每个二进制文件的const值定义不同。更清楚的是,我有类似的东西:

const wordLen = 6
type knowledge [wordLen]byte

这里,wordLen与值6相关联,但是我希望有不同的二进制文件,值从5到10不等。我可以将它变为变量,然后使用切片而不是数组,但这会对我的柔软产生巨大的性能影响(是的,我试过)。

我希望在go build参数上有一些构建标记,以指示wordLen对于给定二进制文件的值。那么,这样做(尽可能是惯用的)是什么意思?

2 个答案:

答案 0 :(得分:10)

是的,可以使用Build Constraints

您可以使用go build标记向-tags提供这些约束的列表。

示例:

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

答案 1 :(得分:4)

它没有解决你的确切问题,但它可以解决其他问题,所以我加入了强制性,你可以使用go编译器的-ldflags选项:

go build -ldflags "-X main.wordLen=6"

但它有两个缺点:

  • 仅适用于字符串
  • 仅适用于诉讼