Расширение карты из других пакетов во время компиляции
Я пытаюсь расширить карту по пакетам во время компиляции. Это возможно?
У меня есть посылка A
с предопределенной картой:
package A
var MyMap = map[string]string{"key1": "value", "key2": "value"}
И я хотел бы расширить карту во время "компиляции". Это должно быть сделано в другой упаковке. Например, так (не работает код ofc.):
package B
import "A"
A.MyMap.Slice1["key3"] = "value" // extend the map during compile time
Это как-то возможно?
3 ответа
Вы не можете сделать это "во время компиляции". На самом деле, композитный литерал, который package A
использует, что также будет построено и использовано во время выполнения. Здесь нет составных буквенных констант.
Идем дальше, какой бы код вы ни написали в пакете B
, если он импортирует пакет A
код пакета B
будет работать только после пакета A
был инициализирован, включая карту, которую вы разместили.
Если ты хочешь A.MyMap
чтобы иметь другое значение, прежде чем оно может быть замечено любым другим пакетом, вы должны изменить источник пакета A
, Это может быть сгенерированный дополнительный файл, который может использовать пакет init()
функция, присваивая новое значение MyMap
или добавление новых значений к нему.
Если вы можете, вы также можете изменить пакет A
так что инициализация MyMap
перемещен в другой исходный файл, который может быть сгенерирован.
На самом деле это расширение во время выполнения, но оно должно соответствовать вашему примеру.
Используйте функцию инициализации.
package B
import "A"
func init() {
A.MyMap["key3"] = "value"
}
Вы передаете строку при связывании с командой
go build -ldflags '-X somemap={"k":"v"}'
а затем проанализировать его на карту во время выполнения. Вы можете легко использовать формат JSON.
Смотрите больше на GcToolchainTricks.