Расширение карты из других пакетов во время компиляции - PullRequest
0 голосов
/ 05 февраля 2019

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

У меня есть пакет 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 ]

0 голосов
/ 05 февраля 2019

На самом деле это расширение во время выполнения, но оно должно соответствовать вашему примеру.

Использовать init функцию.

package B

import "A"

func init() {
    A.MyMap["key3"] = "value"
}
0 голосов
/ 05 февраля 2019

Вы передаете строку во время связывания с помощью команды

go build -ldflags '-X somemap={"k":"v"}'

, а затем анализируете ее для сопоставления во время выполнения.Вы можете легко использовать формат JSON.

Подробнее о GcToolchainTricks .

0 голосов
/ 05 февраля 2019

Вы не можете сделать это "во время компиляции".Фактически, составной литерал, который используется package A, также будет создан и использован во время выполнения.Составных литеральных констант не существует.

В дальнейшем, независимо от того, какой код вы пишете в пакете B, если он импортирует пакет A, код пакета B будет работать только после того, как пакет A будетинициализирован, включая опубликованную вами карту.

Если вы хотите, чтобы A.MyMap имел другое значение, прежде чем оно будет видно любому другому пакету, вам следует изменить источник пакета A.Это может быть сгенерированный дополнительный файл, который может использовать функцию пакета init(), назначая новое значение для MyMap или добавляя к нему новые значения.

Если вы можете, вы также можете изменить пакет A, чтобы инициализация MyMap была перемещена в другой исходный файл, который можно сгенерировать.

...