当前位置: 首页 > 面试题库 >

Golang的嵌套地图

何星鹏
2023-03-14
问题内容
func main() {
    var data = map[string]string{}
    data["a"] = "x"
    data["b"] = "x"
    data["c"] = "x"
    fmt.Println(data)
}

它运行。

func main() {
    var data = map[string][]string{}
    data["a"] = append(data["a"], "x")
    data["b"] = append(data["b"], "x")
    data["c"] = append(data["c"], "x")
    fmt.Println(data)
}

它也可以运行。

func main() {
    var w = map[string]string{}
    var data = map[string]map[string]string{}
    w["w"] = "x"
    data["a"] = w
    data["b"] = w
    data["c"] = w
    fmt.Println(data)
}

它再次运行!

func main() {
    var data = map[string]map[string]string{}
    data["a"]["w"] = "x"
    data["b"]["w"] = "x"
    data["c"]["w"] = "x"
    fmt.Println(data)
}

但是失败了!?

Go中的嵌套地图有问题吗?还是对嵌套地图没有多括号支持?


问题答案:

地图类型的零值为nil。尚未初始化。您无法在nil地图中存储值,这是运行时的恐慌。

在上一个示例中,您初始化了(外部)data映射,但是它没有条目。当您像那样对它进行索引时data["a"],由于尚无"a"键输入,因此对其进行索引将返回nil用于地图的值类型的零值。因此,尝试分配给data["a"]["w"]运行时恐慌。

您必须先初始化地图,然后再在其中存储元素,例如:

var data = map[string]map[string]string{}

data["a"] = map[string]string{}
data["b"] = make(map[string]string)
data["c"] = make(map[string]string)

data["a"]["w"] = "x"
data["b"]["w"] = "x"
data["c"]["w"] = "x"
fmt.Println(data)

输出(在Go Playground上尝试):

map[a:map[w:x] b:map[w:x] c:map[w:x]]

请注意,当您声明映射类型的变量并使用复合文字对其进行初始化时(如所述var data = map[string]string{}),这也算作初始化。

请注意,您还可以使用复合文字来初始化嵌套地图:

var data = map[string]map[string]string{
    "a": map[string]string{},
    "b": map[string]string{},
    "c": map[string]string{},
}

data["a"]["w"] = "x"
data["b"]["w"] = "x"
data["c"]["w"] = "x"
fmt.Println(data)

输出是相同的。在Go Playground上尝试一下。



 类似资料:
  • 问题内容: 因此,我正在尝试解析JSON响应。它可以是多个层次。这是我所做的: 首先,这是正确的方法吗? 可以说响应如下: 要访问key ,我看到一个游乐场正在这样做: 在这里,表示法是什么?这样对吗? 问题答案: 该符号称为类型断言。 对于接口类型和类型的表达式,主表达式断言不是,并且其中存储的值是类型。 你的例子: 这意味着与key关联的地图的值是类型(另一个具有key和任何值的地图)。并且您

  • 问题内容: Go支持在函数内部嵌套结构,但除了lambda之外没有嵌套函数,这是否意味着无法在函数内部定义嵌套类? 因此,类在函数内部被削弱感到有点奇怪。 有什么提示吗? 问题答案: 实际上,无论您要声明 带有 接收器还是 不 带有接收器的函数都没有关系:不允许在Go中嵌套函数。 尽管您可以使用函数文字来实现以下目的: 在这里,我们创建了一个具有函数类型的变量,并将其分配给另一个函数。调用“外部”

  • 问题内容: 给出以下代码: 我得到以下输出: 因此,出于某种原因,密钥是试图取消对整个结构的编组,而不是仅仅应该解组。我做错了吗,或者这是json编码器中的错误?顺便说一句,正在进行1.2。 问题答案: 为什么最后没有结果 这不是解码器中的错误,而是代码中的错误。你只是将另一个地址为本地指针在。更正的代码: 语义:将地址分配给。这类似于。 的语义:将所有内容复制到指向的地方。 这项工作的一项要求是

  • 问题内容: 我有一个嵌套与包含任何键,或值。我想像下面这样压扁它们。 数据如下: 地图看起来像: 地图的展平应如下所示: 注意: 嵌套数组或映射的级别未知,可能会超过2个级别。 问题答案: 您可以使用递归来展平。每次遇到a时,通过展平来递归; 当您遇到时,请对其进行迭代,然后将索引添加到当前键中。否则,可以简单地设置一个值。在行动中看到下面的代码在这里。

  • 问题内容: 嗨,我在解组嵌套的JSON数组时遇到问题。我应该创建什么结构?我想避免使用尽可能多的东西,但是我真的不知道在这种情况下是否有可能。 杰森,我想解组: 和我想用来解组的结构: 链接到示例:https : //play.golang.org/p/owuMptNrix 问题答案: 是的,答案只是一小部分: 好感谢你的问题,我发现这个错误的工具,我总是用它的Json操作一起去,它可以为你节省很

  • 问题内容: 我可以使用Golang将平面对象插入BigQuery中-如何将嵌套数据插入表中? 我的BigQuery模式如下所示(从示例中): 我的第一次插入尝试如下所示(示例): 哪个变平并插入没有问题。我只是在用visit_duration 但是,我需要遍历一个片段并添加到访问记录中。我试图建立一个 访问 对象(没有要测试的循环)并将其添加到行中,但它没有插入,并且我没有收到任何错误: - -[