为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
临摹微笑 2023-06-05 17:16:13
我正在尝试在“编译时”跨包扩展地图。这可能吗?我有A一个带有预定义地图的包:package Avar MyMap = map[string]string{"key1": "value", "key2": "value"}我想在“编译时”期间扩展地图。这将在另一个包中完成。例如像这样(不是工作代码 ofc。):package Bimport "A"A.MyMap.Slice1["key3"] = "value" // extend the map during compile time这有可能吗?
查看完整描述

3 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

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

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

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

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


查看完整回答
反对 回复 2023-06-05
?
白板的微信

TA贡献1883条经验 获得超3个赞

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

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

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

查看完整回答
反对 回复 2023-06-05
?
青春有我

TA贡献1784条经验 获得超8个赞

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

使用初始化函数。

package B


import "A"


func init() {

    A.MyMap["key3"] = "value"

}


查看完整回答
反对 回复 2023-06-05
  • 3 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信