请考虑以下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>
Run Code Online (Sandbox Code Playgroud)
由于我的XML数据结构/文件可能扩展到10000或者可能超过100000个媒体项元素,我需要能够在解析的Go地图(或者在这里使用什么结构?)中访问各个项目,就像我们一样map[key]type - 但我需要能够使用url或id作为键,我无法弄清楚如何使用指向相同值的2个键创建地图.
从上面解析的XML数据结构中,我需要在Go中解析它并将其存储在如下类型中:
map[string, string]MediaItem
Run Code Online (Sandbox Code Playgroud)
其中键应该是URL和ID,所以我能够与ID 1做着获得该项目myMap["1"]或myMap["media/somefolder/pic1.jpg"].两者都应该返回相应的MediaItem.)
我无法解决如何实现这一点,或者有更好的方法来实现这一点?
icz*_*cza 10
保持map类型,您可以使用2(3)种不同的解决方案:
最简单的是构建2个映射,1表示密钥是url,1表示密钥是id:
var byUrlMap map[string]*MediaItem
var byIdMap map[string]*MediaItem
Run Code Online (Sandbox Code Playgroud)
请注意,您应该存储指针而不是结构,以避免重复值.
如果你需要一个MediaItemid:
mi := byIdMap[id]
Run Code Online (Sandbox Code Playgroud)
同样通过url:
mi2 := byUrlMap[url]
Run Code Online (Sandbox Code Playgroud)
另一个选项可以是为实际键值添加前缀,但这不是那么有效,但结果是,您只有一个映射.
例如,您可以使用"url:"和键前缀URL键,并"id:"为url和id键存储相同的指针值,例如:
var miMap = make(map[string]*MediaItem)
mi := &MediaItem{}
miMap["url:http://something"] = mi
miMap["id:1"] = mi
Run Code Online (Sandbox Code Playgroud)
得到一个元素:
mi2 := miMap["id:" + id] // By id
mi3 := miMap["url:" + url] // By url
Run Code Online (Sandbox Code Playgroud)
这与"使用键前缀"类似:如果您保证URL和ID永远不会相同(意味着您永远不会拥有与其他项目的URL相同的ID,反之亦然),您可以简单地使用两个键都没有前缀,并设置相同的值(指针).
密钥前缀的目的是确保最终的url密钥永远不会与最终的id密钥相同(通过对这两种类型的密钥使用不同的前缀来实现).但是如果这个条件自然是真的(例如,string数字id 的值永远不会是有效的url),我们真的不需要前缀:
var miMap = make(map[string]*MediaItem)
mi := &MediaItem{}
miMap["http://something"] = mi
miMap["1"] = mi
Run Code Online (Sandbox Code Playgroud)
得到一个元素:
mi2 := miMap[id] // By id
mi3 := miMap[url] // By url
Run Code Online (Sandbox Code Playgroud)
更好的解决方案是使用带有两个字段的结构作为键:
type key struct {
url string
id int
}
m := make(map[key]MediaItem)
m[key{url: "http://...", id: 2}] = MediaItem{}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9487 次 |
| 最近记录: |