首页 文章

Golang Map ,每个值有多个键

提问于
浏览
3

请考虑以下XML数据结构:

<MediaItems>
    <item url="media/somefolder/pic1.jpg" id="1">
        <groups>
            <group>1</group>
            <group>2</group>
        </groups>
    </item>
    <item url="media/somefolder/pic2.jpg" id="2">
        <groups>
            <group>3</group>
            <group>7</group>
        </groups>
    </item>
</MediaItems>

由于我的XML数据结构/文件可能扩展到10000或者可能是100000个媒体项元素,我需要能够在解析的Go映射(或者在这里使用什么结构?)中访问各个项目,就像我们使用 map[key]type 一样 - 但我需要能够使用url或id作为键,我无法弄清楚如何使用指向相同值的2个键创建 Map .

从上面解析的XML数据结构中,我需要在Go中解析它并将其存储在如下类型中:

map[string, string]MediaItem

键应该是url和id,所以我能够获得id为1的项目 myMap["1"]myMap["media/somefolder/pic1.jpg"] . 两者都应该返回相应的 MediaItem . )

我无法解决如何实现这一点,或者有更好的方法来实现这一点?

1 回答

  • 8

    保持 map 类型,您可以使用2(3)种不同的解决方案:

    有2张 Map

    最简单的方法是构建2个映射,1表示密钥是url,1表示密钥是id:

    var byUrlMap map[string]*MediaItem
    var byIdMap map[string]*MediaItem
    

    请注意,您应该存储指针而不是结构,以避免重复值 .

    如果您需要 MediaItem by id:

    mi := byIdMap[id]
    

    同样通过url:

    mi2 := byUrlMap[url]
    

    带键前缀

    另一个选项可以是为实际键值添加前缀,但这不是那么有效,但结果是,您只有一个映射 .

    例如,您可以使用带有 "url:" 的URL键和带有 "id:" 的ID,并为url和id键存储相同的指针值,例如:

    var miMap = make(map[string]*MediaItem)
    
    mi := &MediaItem{}
    miMap["url:http://something"] = mi
    miMap["id:1"] = mi
    

    得到一个元素:

    mi2 := miMap["id:" + id]   // By id
    mi3 := miMap["url:" + url] // By url
    

    使用“按原样”键

    这与“使用密钥前缀”类似:如果您保证URL和ID永远不会相同(意味着您永远不会拥有与其他项目的URL相同的ID,反之亦然),您可以简单地使用两个键都没有前缀,并设置相同的值(指针) .

    密钥前缀的目的是确保最终的url密钥永远不会与最终的id密钥相同(通过对这两种类型的密钥使用不同的前缀来实现) . 但是如果这个条件自然是正确的(例如,数字id的 string 值永远不会是有效的url),我们真的不需要这些前缀:

    var miMap = make(map[string]*MediaItem)
    
    mi := &MediaItem{}
    miMap["http://something"] = mi
    miMap["1"] = mi
    

    得到一个元素:

    mi2 := miMap[id]  // By id
    mi3 := miMap[url] // By url
    

相关问题