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

Extend map from other packages at compile time

我正在尝试在 'compile time' 扩展跨包的映射。这可能吗?

我有包含预定义地图的包 A

package A

var MyMap = map[string]string{"key1": "value", "key2": "value"}

而且我想在 'compile time' 期间扩展地图。这应在另一个包中完成。例如。像这样(不是工作代码):

package B

import "A"

A.MyMap.Slice1["key3"] = "value" // extend the map during compile time

这有可能吗?

你不能这样做 "at compile" 次。事实上,package A使用的复合文字,也将在运行时构造和使用。没有复合文字常量。

更进一步,无论你在包 B 中编写什么代码,如果它导入包 A,包 B 的代码只会在包 [=12] 之后 运行 =] 已初始化,包括您发布的地图。

如果您希望 A.MyMap 在被任何其他包看到之前具有不同的值,您应该修改包 A 的源代码。这可能是生成的附加文件,它可以使用包 init() 函数,为 MyMap 分配新值,或向其添加新值。

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

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

使用init函数。

package B

import "A"

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

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

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

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

更多信息见GcToolchainTricks