Dictionary 在编译时从其他包扩展映射

Dictionary 在编译时从其他包扩展映射,dictionary,go,composite-literals,Dictionary,Go,Composite Literals,我试图在“编译时”跨包扩展映射。这可能吗 我有一个带有预定义地图的包A: package A var MyMap = map[string]string{"key1": "value", "key2": "value"} 我想在“编译时”扩展映射。这应在另一个包装中完成。例如,像这样(非工作代码ofc): 这可能吗?您不能在“编译”时执行此操作。事实上,包A使用的复合文本也将在运行时构造和使用。没有复合文字常量 进一步说,无论您在包B中编写什么代码,如果它导入包A,包B的代码只会在包A初始化

我试图在“编译时”跨包扩展映射。这可能吗

我有一个带有预定义地图的包
A

package A

var MyMap = map[string]string{"key1": "value", "key2": "value"}
我想在“编译时”扩展映射。这应在另一个包装中完成。例如,像这样(非工作代码ofc):

这可能吗?

您不能在“编译”时执行此操作。事实上,
包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格式


有关的详细信息,请参见。

该设备正在运行ofc。我有意在编译时使用它:-/I尝试了init(),但在没有实际导入包的情况下调用此函数失败。我想我得想办法绕过它。这意味着
包a
的地图将在第一次与包交互时构建?或者在导入时?包
A
将在任何其他包引用任何内容之前初始化。
go build -ldflags '-X somemap={"k":"v"}'