在go结构中初始化深度图嵌套

时间:2018-02-05 17:09:47

标签: dictionary go struct

要初始化结构中的地图,应执行以下操作:

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个结构,每个结构都有一个结构作为键。 你如何初始化它,并准备好它?

2 个答案:

答案 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

游乐场示例:https://play.golang.org/p/0JSN0yjRPif

答案 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])
}

运行示例default jQuery .d.ts file

编辑:

您还可以使用几个元素初始化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