我正在尝试在“编译时”跨包扩展映射。这可能吗?
我的软件包A
带有预定义的地图:
package A
var MyMap = map[string]string{"key1": "value", "key2": "value"}
我想在“编译时”扩展地图。这应该在另一个程序包中完成。例如。像这样(不是工作代码):
package B
import "A"
A.MyMap.Slice1["key3"] = "value" // extend the map during compile time
这有可能吗?
答案 0 :(得分:3)
您不能在“编译”时执行此操作。实际上,package A
使用的复合文字也将在运行时构造和使用。没有复合文字常量。
更进一步,无论您在软件包B
中编写什么代码,如果它导入软件包A
,则软件包B
的代码将仅在初始化软件包A
后运行,包括您发布的地图。
如果您希望A.MyMap
具有不同的值才能被其他任何软件包看到,则应修改软件包A
的来源。这可能是生成的其他文件,可以使用包init()
函数,为MyMap
分配新值或为其添加新值。
如果可以的话,还可以修改软件包A
,以便将MyMap
的初始化移动到另一个可以生成的源文件中。
答案 1 :(得分:2)
答案 2 :(得分:2)
您在与命令链接时传递了一个字符串
go build -ldflags '-X somemap={"k":"v"}'
,然后在运行时将其解析为映射。您可以轻松使用JSON格式。
有关GcToolchainTricks的更多信息。