要在结构中初始化映射,应该执行以下操作:
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个结构,每个结构都有一个作为键的结构。如何初始化它,并使其准备就绪?
发布于 2018-02-06 17:55:17
您想要的是拍卖一个具有默认值的映射,它不是零值,而是一个可以随时使用的值,在本例中,是一个已生成的映射。
在讨论解决方案之前,这里有一个拍卖问题:https://github.com/golang/go/issues/3117
由于原因,如果结构存储在映射中,Go现在不支持为结构的字段分配。
要解决这个问题,您需要使用指向该结构的指针,并将指针存储在映射中。因此,您的数据结构需要更改如下:
type Base struct {
base map[int8]uint64
}
type Middle struct {
baseObjects map[int8]*Base
}
type Top struct {
middleObjects map[int8]*Middle
}和核心逻辑:一张简约的价值图。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发布于 2018-02-05 23:25:28
只需使用空映射作为其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])
}运行示例这里
https://stackoverflow.com/questions/48627868
复制相似问题