Расширение карты из других пакетов во время компиляции

Я пытаюсь расширить карту по пакетам во время компиляции. Это возможно?

У меня есть посылка 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.

Другие вопросы по тегам