gpt4 book ai didi

go - 有没有相当于Python的ChainMap的golang包?

转载 作者:IT王子 更新时间:2023-10-29 02:30:50 25 4
gpt4 key购买 nike

Python 的 ChainMap 使您能够将多个映射链接在一起,以便查找按顺序搜索所有映射,直到找到匹配的键。这是关于它的许多文章之一:

https://dzone.com/articles/python-201-what-is-a-chainmap

以及官方文档:

https://docs.python.org/3/library/collections.html

有人知道用 Go 编写的现有等效包吗?到目前为止,我一直找不到一个,如果确实存在的话,我想避免重新发明轮子。

最佳答案

没有包,但实现类似的东西相当简单:

让我们使用map[string]接口(interface){}

package main

import (
"reflect"
"testing"
)

type ChainMap struct {
Map map[string]interface{}
maps []map[string]interface{}
}

func NewChainMap(maps ...map[string]interface{}) ChainMap {
if len(maps) == 0 {
return ChainMap{
Map: make(map[string]interface{}, 0),
maps: maps,
}
}
r := make(map[string]interface{}, len(maps[0]))
for i := len(maps) - 1; i >= 0; i-- {
m := maps[i]
for k, v := range m {
r[k] = v
}
}
return ChainMap{
Map: r,
maps: maps,
}
}

func (c ChainMap) Parents() ChainMap {
if len(c.maps) < 2 {
return c
}
return NewChainMap(c.maps[1:]...)
}

一个小测试:

func TestChainMap(t *testing.T) {
var m = NewChainMap(
map[string]interface{}{
"foo": "bar",
},
map[string]interface{}{
"foo": "baz",
"hello": "world",
},
map[string]interface{}{
"foo": "baw",
},
)
if !reflect.DeepEqual(
m.Map,
map[string]interface{}{
"foo": "bar",
"hello": "world",
},
) {
t.Fail()
}

if !reflect.DeepEqual(
m.Parents().Map,
map[string]interface{}{
"foo": "baz",
"hello": "world",
},
) {
t.Fail()
}
}

关于go - 有没有相当于Python的ChainMap的golang包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55330763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com