Нет пакета, но довольно просто реализовать нечто подобное:
Давайте сделаем это с 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()
}
}