【问题标题】:Extend map from other packages at compile time在编译时从其他包中扩展映射
【发布时间】:2019-02-04 21:53:09
【问题描述】:

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

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

这有可能吗?

【问题讨论】:

    标签: dictionary go composite-literals


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 意思是package A的映射将在第一次与包交互时构建?还是在进口时?
    • A 将在任何其他包引用其中的任何内容之前被初始化。
    【解决方案2】:

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

    使用init 函数。

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

    【讨论】:

    • 那个正在工作。我故意在编译时需要它:-/我尝试了 init() 但未能在没有实际导入包的情况下调用它。我想我得想办法解决它。
    【解决方案3】:

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

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

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

    GcToolchainTricks上查看更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2011-08-16
      相关资源
      最近更新 更多