Есть ли способ определить константу во время сборки в 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