在编译时从其他包扩展地图
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。
我正在尝试在 '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。