据我了解,Go 中的类型slice
和map
在很多方面都很相似。他们都是reference
(或container
)类型。在抽象数据类型方面,它们分别表示数组和关联数组。
然而,他们的行为却截然不同。
var s []int var m map[int]int
虽然我们可以立即使用声明的切片(附加新项或重新切片),但我们不能对新声明的映射做任何事情。我们必须显make
式调用函数并初始化地图。因此,如果某个结构包含一个映射,我们必须为该结构编写一个构造函数。
所以,问题是为什么不能在声明映射时添加一些语法糖并同时分配和初始化内存。
我确实用谷歌搜索了这个问题,学到了一个新词“avtovivification”,但仍然看不出原因。
我不是在谈论结构文字。是的,您可以通过提供诸如m := map[int]int{1: 1}
. 但是,如果您有一些结构:
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必须显式初始化映射。
杨魅力
海绵宝宝撒
相关分类