在Go中使用嵌套数据 - 使用结构?

时间:2016-06-08 10:00:31

标签: go

我需要在我的go代码内部维护一些数据:一个ID嵌套多个级别的深度,这将在提供父道具的名称时被访问。例如,如果用JavaScript编写,我会做类似的事情:

var data = {
    1111: {
        la1: {
            lb1: 1343584765,
            lb2: 1545438458
        },
        la2: {
            lb1: 1263268535,
            lb2: 1468904679
        }
    },
    2222: {
        la1: {
            lb1: 1645078365,
            lb2: 1457732458
        },
        la2: {
            lb1: 1682974682,
            lb2: 1782975685
        }
    }
}

然后像这样访问(是的,顶级道具需要是一个int):

data[1111]['la1']['la2'] //gets 1343584765

但我无法看到如何使用Go结构构建此结构,我读过的大多数内容都建议不要这样做。我能看到的唯一另一种方法是在Go中使用这个逻辑,但它感觉很乱,这可能会变得更大,因此难以维护:

func getVal(
    varA int,
    varB string,
    varC string,
) int {
    if varA == 1111 {
        if varB == "la1" {
            if varC == "lb1" {
                return 1343584765
            }
            if varC == "lb2" {
                return 1545438458
            }
        }
        if varB == "la2" {
            if varC == "lb1" {
                return 1263268535
            }
            if varC == "lb2" {
                return 1468904679
            }
        }
    }
    if varA == 2222 {
    ....etc

然后访问:

getVal(1111, "la1", "lb1") //gets 1343584765

非常感谢能帮助我的人!

1 个答案:

答案 0 :(得分:3)

你解决问题的方式非常奇特。也许你已经知道了这一点,但是你不会:use maps

我用一个命名不好的类型做了一个例子(因为我不知道你的用例),而且我还把所有东西都变成了字符串以保持简单。

type l3Map map[string]string
type l2Map map[string]l3Map
type l1Map map[string]l2Map

func main() {

    data := l1Map{
        "1111": l2Map{
            "la1": l3Map{
                "lb1": "1343584765",
                "lb2": "1545438458",
            },
        },
    }

    fmt.Printf("%v\n", data["1111"]["la1"]["lb2"])
}

https://play.golang.org/p/daKjDbX8Ao