Go 中的映射初始化

2024-01-01

据我了解,类型slice and map在很多方面与 Go 相似。他们两个reference (or container) 类型。就抽象数据类型而言,它们分别表示数组和关联数组。

然而,他们的行为却截然不同。

var s []int
var m map[int]int

虽然我们可以立即使用声明的切片(附加新项目或重新切片),但我们无法对新声明的映射执行任何操作。我们必须打电话make函数并显式初始化映射。因此,如果某个结构体包含映射,我们必须为该结构体编写一个构造函数。

所以,问题是为什么不能添加一些语法糖并在声明映射时分配和初始化内存。

我确实用谷歌搜索了这个问题,学到了一个新词“autovivification”,但仍然看不到原因。

我不是在谈论结构文字。是的,您可以通过提供诸如m := map[int]int{1: 1}。然而,如果你有一些struct https://play.golang.org/p/A1GgAndnccD:

package main

import (
    "fmt"
)

type SomeStruct struct {
    someField map[int]int
    someField2 []int
}

func main() {
    s := SomeStruct{}
    s.someField2 = append(s.someField2, -1) // OK
    s.someField[0] = -1 // panic: assignment to entry in nil map
    fmt.Println(s)
}

不可能立即使用结构(所有字段都使用默认值)。必须创建一个构造函数SomeStruct它必须显式初始化地图。


虽然我们可以立即使用声明的切片(附加新项目或重新切片),但我们无法对新声明的映射执行任何操作。我们必须打电话make函数并显式初始化映射。因此,如果某个结构体包含映射,我们必须为该结构体编写一个构造函数。

这不是真的。默认值——或更准确地说零值 https://golang.org/ref/spec#The_zero_value–对于切片和贴图来说都是nil。你可以做“同样的”nil地图,就像你可以用nil片。您可以检查 a 的长度nil地图,您可以索引nil映射(结果将是映射值类型的零值),例如以下全部有效:

var m map[int]int

fmt.Println(m == nil) // Prints true
fmt.Println(len(m))   // Prints 0
fmt.Println(m[2])     // Prints 0

尝试一下去游乐场 https://play.golang.org/p/ff7UiRB3kq1.

您对零值切片的更多“感觉”是您可以向其添加值。这是事实,但在幕后,将使用确切的分配新切片make() https://golang.org/pkg/builtin/#make您必须为映射调用内置函数才能向其中添加条目,并且必须(重新)分配返回的切片。因此,零值切片比零值映射“不再可供使用”。append() https://golang.org/pkg/builtin/#append只是负责必要的(重新)分配和复制。我们可以有一个“等价物”addEntry()您可以向其传递映射值和键值对的函数,并且如果传递的映射是nil,它可以分配一个新的映射值并返回它。如果你不打电话append(),您不能向 a 添加值nil切片,就像您不能向切片添加条目一样nil map.

切片和映射为零值的主要原因是nil(而不是初始化的切片或映射)是性能和效率。通常,映射或切片值(变量或结构字段)永远不会被使用,或者不会立即使用,因此如果在声明时分配它们,那将浪费内存(和一些 CPU)资源,更不用说它给垃圾收集器带来了更多的工作。此外,如果零值是一个初始化值,它通常是不够的(例如,0 大小的切片不能容纳任何元素),并且当您向其中添加新元素时,它通常会被丢弃(因此初始分配将是完全浪费)。

是的,在某些情况下您确实想立即使用切片和映射,在这种情况下您可以调用make()您自己,或使用复合文字 https://golang.org/ref/spec#Composite_literals。您还可以使用特殊形式make()您可以在其中提供地图的(初始)容量,避免未来对地图内部结构进行重组(这通常需要不可忽略的计算)。自动非nil默认值无法猜测您需要什么容量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 中的映射初始化 的相关文章

随机推荐