在编译时从其他包扩展地图

时间:2019-02-04 21:53:09

标签: dictionary go composite-literals

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

我的软件包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

这有可能吗?

3 个答案:

答案 0 :(得分:3)

您不能在“编译”时执行此操作。实际上,package A使用的复合文字也将在运行时构造和使用。没有复合文字常量。

更进一步,无论您在软件包B中编写什么代码,如果它导入软件包A,则软件包B的代码将仅在初始化软件包A后运行,包括您发布的地图。

如果您希望A.MyMap具有不同的值才能被其他任何软件包看到,则应修改软件包A的来源。这可能是生成的其他文件,可以使用包init()函数,为MyMap分配新值或为其添加新值。

如果可以的话,还可以修改软件包A,以便将MyMap的初始化移动到另一个可以生成的源文件中。

答案 1 :(得分:2)

它实际上是运行时的扩展,但它应该适合您的示例。

使用init功能。

package B

import "A"

func init() {
    A.MyMap["key3"] = "value"
}

答案 2 :(得分:2)

您在与命令链接时传递了一个字符串

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

,然后在运行时将其解析为映射。您可以轻松使用JSON格式。

有关GcToolchainTricks的更多信息。