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

Fab*_*ien 7 const go build-time

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

const wordLen = 6
type knowledge [wordLen]byte
Run Code Online (Sandbox Code Playgroud)

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

我希望在go build参数上有一些构建标记,以指示wordLen给定二进制文件的值是什么.那么,(尽可能惯用)的方式是什么呢?

Elw*_*nar 13

它不能解决您的确切问题,但它可能会解决其他问题,因此为了完整起见,我添加您可以使用-ldflagsgo 编译器的选项:

go build -ldflags "-X main.wordLen=6"
Run Code Online (Sandbox Code Playgroud)

然而它有两个缺点:

  • 仅适用于字符串
  • 仅适用于变量

  • 这些都是巨大的缺点,因为我需要使用数字常量;)但是,在某些情况下这是一个非常有用的功能。 (2认同)

nem*_*emo 10

是的,这可以使用Build Constraints.

您可以go build使用该-tags标志提供这些约束的列表.

例:

main.go

package main

import "fmt"

func main() {
    fmt.Println(f)
}
Run Code Online (Sandbox Code Playgroud)

foo.go

// +build foo

package main

const f = "defined in foo.go"
Run Code Online (Sandbox Code Playgroud)

bar.go

// +build bar

package main

const f = "defined in bar.go"
Run Code Online (Sandbox Code Playgroud)

使用不同的标记编译代码会得到不同的结果:

$ go build -tags foo
$ ./main
defined in foo.go
$ go build -tags bar
$ ./main
defined in bar.go
Run Code Online (Sandbox Code Playgroud)