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

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


我有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

这有可能吗?


临摹微笑
浏览 97回答 3
3回答

蓝山帝景

您不能在“编译”时执行此操作。事实上,package A使用的复合文字,也将在运行时构造和使用。没有复合文字常量。更进一步,无论您在 package 中编写什么代码B,如果它导入 package A, package 的代码B只会在 packageA初始化后运行,包括您发布的地图。如果你想A.MyMap在任何其他包看到它之前有一个不同的值,你应该修改包的源A。这可能是生成的附加文件,它可以使用包init()函数,为 分配新值MyMap,或向其添加新值。如果可以,您还可以修改 packageA以便将 的初始化MyMap移动到另一个可以生成的源文件。

白板的微信

您在链接时使用命令传递一个字符串go build -ldflags '-X somemap={"k":"v"}'然后在运行时将其解析为映射。您可以轻松使用 JSON 格式。

青春有我

它实际上是运行时的扩展,但它应该适合您的示例。使用初始化函数。package Bimport "A"func init() {    A.MyMap["key3"] = "value"}
打开App,查看更多内容
随时随地看视频慕课网APP