首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化go结构中的深度映射嵌套

初始化go结构中的深度映射嵌套
EN

Stack Overflow用户
提问于 2018-02-05 17:09:46
回答 2查看 599关注 0票数 2

要在结构中初始化映射,应该执行以下操作:

代码语言:javascript
复制
someStruct.nestedMap = make(map[int8]int8)

但是,如果您有这样的代码结构,您应该做什么:

代码语言:javascript
复制
type Base struct {
    base map[int8]uint64
}

type Middle struct {
    baseObjects map[int8]Base
}

type Top struct {
    middleObjects map[int8]Middle
}

在这里,我们一共有3个结构,每个结构都有一个作为键的结构。如何初始化它,并使其准备就绪?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-06 17:55:17

您想要的是拍卖一个具有默认值的映射,它不是零值,而是一个可以随时使用的值,在本例中,是一个已生成的映射。

在讨论解决方案之前,这里有一个拍卖问题:https://github.com/golang/go/issues/3117

由于原因,如果结构存储在映射中,Go现在不支持为结构的字段分配。

要解决这个问题,您需要使用指向该结构的指针,并将指针存储在映射中。因此,您的数据结构需要更改如下:

代码语言:javascript
复制
type Base struct {
    base map[int8]uint64
}

type Middle struct {
    baseObjects map[int8]*Base
}

type Top struct {
    middleObjects map[int8]*Middle
}

和核心逻辑:一张简约的价值图。Go不支持普通地图,但我们可以扩展它,使用方法将其封装起来。

代码语言:javascript
复制
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
}

当我们试图获得一个值时,我们首先检查它是否存在。如果没有,我们返回一个新构造的值,如果它确实存在,则返回值。

用法:

代码语言:javascript
复制
t.Get(8).Get(9).base[10] = 14

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

票数 2
EN

Stack Overflow用户

发布于 2018-02-05 23:25:28

只需使用空映射作为其Top属性的值初始化最顶层的结构middleObjects,调用空映射上的任何索引都会返回映射所包含的类型的零值。

代码语言:javascript
复制
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结构,无论如何,这取决于在初始化时需要每个映射拥有多少元素:

代码语言:javascript
复制
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])
}

运行示例这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48627868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档