首页 文章

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

提问于
浏览
7

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

const wordLen = 6
type knowledge [wordLen]byte

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

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

2 回答

  • 4

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

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

    但它有两个缺点:

    • 仅适用于字符串

    • 仅适用于变量

  • 9

    是的,这可以使用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
    

相关问题