在golang中使用变长数组作为映射键

在golang中使用变长数组作为映射键,第1张

概述我找不到一个很好的方法来做到这一点.我想从排序的键值对列表中获得一个映射. type Tag struct { key string value string}type SortedTag []Tag // sorted list of tags.map[SortedTags]T // cannot do. 我可以通过使用分隔符连接所有键值对来解决这个问题,但我觉得这在很多方面 我找不到一个很好的方法来做到这一点.我想从排序的键值对列表中获得一个映射.

type Tag struct {  key   string  value string}type SortedTag []Tag // sorted List of Tags.map[SortedTags]T // cannot do.

我可以通过使用分隔符连接所有键值对来解决这个问题,但我觉得这在很多方面都是低效且容易出错的.转换回键值对很麻烦,因为我们需要拆分输入.而且,如果键值对可以是任何东西,那意味着我们必须逃避它.

如果它是python,我会将Tag存储为排序2-tupless的N-tuple.

如果是java,我会用Map< String,String>创建一个复合对象.使用equals()检查其他散列映射,hashCode()返回映射的所有散列的xor(xor,因为它是可交换的,因此我们可以按任何顺序迭代映射来计算此值).

在去,我想不出任何其他好方法.

解决方法 例如,

package mainimport "fmt"type Tag struct {    Key   string    Value string}type Tags []Tagtype TagsValue struct {    // some type used as Tags value}type TagsMapValue struct {    Tags    TagsValue}type TagsMapKey stringtype TagsMap map[TagsMapKey]TagsMapValuefunc NewTagsMapKey(Tags Tags) TagsMapKey {    b := []byte{}    for _,tag := range Tags {        b = append(b,tag.Key...)        b = append(b,tag.Value...)    }    return TagsMapKey(b[:len(b)])}func (m *TagsMap) AddElement(Tags Tags,TagsValue TagsValue) {    mapKey := NewTagsMapKey(Tags)    mapValue := TagsMapValue{Tags: make(Tags,len(Tags)),TagsValue: TagsValue}    i := 0    for _,tag := range Tags {        key := string(mapKey[i : i+len(tag.Key)])        i += len(tag.Key)        value := string(mapKey[i : i+len(tag.Value)])        i += len(tag.Value)        mapValue.Tags = append(mapValue.Tags,Tag{Key: key,Value: value})    }    (*m)[mapKey] = mapValue    return}func main() {    m := make(TagsMap)    sortedTags := Tags{        {Key: "key1",Value: "value1"},{Key: "key7",Value: "value7"},Value: "value49"},{Key: "key42",Value: "value42"},}    m.AddElement(sortedTags,TagsValue{})    for k,v := range m {        fmt.Println("Tags Key:",k)        fmt.Println("   Tags:      ",v.Tags)        fmt.Println("   Tags Value:",v.TagsValue)    }}

输出:

Tags Key: key1value1key7value7key7value49key42value42   Tags:       [{key1 value1} {key7 value7} {key7 value49} {key42 value42}]   Tags Value: {}

如果您只是尝试测试标签集成员资格,

package mainimport "fmt"type Tag struct {    Key   string    Value string}type Tags []Tagtype TagsSetKey stringtype TagsSet map[TagsSetKey]Tagsfunc NewTagsSetKey(Tags Tags) TagsSetKey {    b := []byte{}    for _,tag.Value...)    }    return TagsSetKey(b[:len(b)])}func (m *TagsSet) AddElement(Tags Tags) {    setKey := NewTagsSetKey(Tags)    setValue := make(Tags,len(Tags))    i := 0    for _,tag := range Tags {        key := string(setKey[i : i+len(tag.Key)])        i += len(tag.Key)        value := string(setKey[i : i+len(tag.Value)])        i += len(tag.Value)        setValue = append(setValue,Value: value})    }    (*m)[setKey] = setValue    return}func (m *TagsSet) IsMember(Tags Tags) bool {    return (*m)[NewTagsSetKey(Tags)] != nil}func main() {    m := make(TagsSet)    sortedTags := Tags{        {Key: "key1",}    m.AddElement(sortedTags)    for k,k)        fmt.Println("   Tags: ",v)    }    // In set    fmt.Println(m.IsMember(sortedTags))    // Not in set    sortedTags[0].Key = "key0"    fmt.Println(m.IsMember(sortedTags))}

输出:

Tags Key: key1value1key7value7key7value49key42value42   Tags:  [{key1 value1} {key7 value7} {key7 value49} {key42 value42}]truefalse
总结

以上是内存溢出为你收集整理的在golang中使用变长数组作为映射键全部内容,希望文章能够帮你解决在golang中使用变长数组作为映射键所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1266284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存