要初始化结构中的地图,应执行以下操作:
someStruct.nestedMap = make(map[int8]int8)
但如果你有这样的代码结构,你应该怎么做:
type Base struct {
base map[int8]uint64
}
type Middle struct {
baseObjects map[int8]Base
}
type Top struct {
middleObjects map[int8]Middle
}
我们总共有3个结构,每个结构都有一个结构作为键。 你如何初始化它,并准备好它?
答案 0 :(得分:2)
你想要的是一个地图,其默认值不是零值,而是一个可以使用的值,在这种情况下是一个制作的地图。
在进入解决方案之前,实际上有一个问题是:https://github.com/golang/go/issues/3117
由于原因,如果结构存储在地图中,Go now不支持分配给结构的字段。
要解决此问题,您需要使用指向该结构的指针,并将指针存储在地图中。因此,您的数据结构需要更改,如:
type Base struct {
base map[int8]uint64
}
type Middle struct {
baseObjects map[int8]*Base
}
type Top struct {
middleObjects map[int8]*Middle
}
核心逻辑:一个defualt值映射。 Go不支持使用普通地图,但我们可以使用方法来扩展它。
func (t Top) Get(i int8) *Middle {
x, ok := t.middleObjects[i]
if !ok {
v := NewMiddle()
t.middleObjects[i] = v
return v
}
return x
}
func (m Middle) Get(i int8) *Base {
x, ok := m.baseObjects[i]
if !ok {
v := NewBase()
m.baseObjects[i] = v
return v
}
return x
}
当我们尝试获取值时,我们首先检查它是否存在。如果没有,我们返回一个新构造的,如果它确实存在,则返回值。
用法:
t.Get(8).Get(9).base[10] = 14
答案 1 :(得分:1)
只需使用空地图初始化最顶层的结构Top
作为其middleObjects
属性的值,调用空地图上的任何索引都会返回地图所包含类型的零值。
package main
import (
"fmt"
)
type Base struct {
base map[int8]uint64
}
type Middle struct {
baseObjects map[int8]Base
}
type Top struct {
middleObjects map[int8]Middle
}
func main() {
top := Top{
middleObjects: make(map[int8]Middle),
}
// Outputs: "Top: {map[]}"
fmt.Printf("Top: %v\n", top)
// Outputs: "Base element: 0"
fmt.Printf("Base element: %v\n", top.middleObjects[5].baseObjects[3].base[0])
}
编辑:
您还可以使用几个元素初始化Top
结构,在任何情况下,它都取决于每个映射在初始化时需要多少元素:
func main() {
top := Top{
middleObjects: map[int8]Middle{
0: Middle{
baseObjects: map[int8]Base{
0: Base{
base: map[int8]uint64{
0: 1234,
},
},
},
},
},
}
// After that you have to add one by one
top.middleObjects[5] = Middle{
baseObjects: map[int8]Base{
0: Base{
base: map[int8]uint64{
0: 123456,
},
},
},
}
// If there's a middleObject with that index
top.middleObjects[0].baseObjects[1] = Base{
base: map[int8]uint64{
0: 1111,
},
}
// Outputs: "Base element: 1234"
fmt.Printf("Base element: %v\n", top.middleObjects[0].baseObjects[0].base[0])
// Outputs: "Base element: 123456"
fmt.Printf("Base element: %v\n", top.middleObjects[5].baseObjects[0].base[0])
// Outputs: "Base element: 1111"
fmt.Printf("Base element: %v\n", top.middleObjects[0].baseObjects[1].base[0])
top.middleObjects[0].baseObjects[0].base[0] = 2222
// Outputs: "Base element: 2222"
fmt.Printf("Base element: %v\n", top.middleObjects[0].baseObjects[0].base[0])
}
运行示例here