Есть ли способ определить константу во время сборки в Go?

У меня есть программа на Go, которую я хочу скомпилировать в кучу двоичных файлов, каждая из которых имеет const Значение определяется по-разному. Более понятно, у меня есть что-то вроде этого:

const wordLen = 6
type knowledge [wordLen]byte

Вот, wordLen связан со значением 6, но я хочу иметь разные двоичные файлы со значениями в диапазоне от 5 до 10. Я мог бы сделать его переменной, а затем использовать срез, а не массив, но это оказало бы огромное влияние на производительность мягкий (да, я пробовал).

Я хотел бы иметь некоторые теги сборки на go build аргумент, чтобы указать, что значение wordLen для данного двоичного файла. Итак, как (настолько идиоматично, насколько это возможно) способ сделать это?

2 ответа

Решение

Да, это возможно, используя ограничения сборки.

Вы можете предоставить список этих ограничений 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

Это не решит вашу конкретную проблему, но может решить и другие, поэтому я добавлю, что вы можете использовать -ldflags опция компилятора go:

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

Однако у него есть два недостатка:

  • Работает только для строк
  • Работает только на VARS
Другие вопросы по тегам