make(map) 和 map{} 的区别

Ale*_*lls 6 go

只是想知道两者之间有什么区别:

z := make(map[*test] string)
Run Code Online (Sandbox Code Playgroud)

z := map[*test] string{}
Run Code Online (Sandbox Code Playgroud)

我是在想象事物还是它们都无效?

pet*_*rSO 8

Go 编程语言规范

制作切片、贴图和通道

内置函数 make 接受类型 T,它必须是切片、映射或通道类型,可选地后跟特定于类型的表达式列表。它返回一个类型为 T(不是 *T)的值。内存按照初始值部分中的描述进行初始化。

Call         Type T  Result
make(T)      map     map of type T
make(T, n)   map     map of type T with initial space for approximately n elements
Run Code Online (Sandbox Code Playgroud)

复合文字

复合文字为结构体、数组、切片和映射构造值,并在每次评估它们时创建一个新值。它们由文字类型后跟花括号绑定的元素列表组成。每个元素之前可以有一个相应的键。

map[string]int{}
map[string]int{"one": 1}
Run Code Online (Sandbox Code Playgroud)

make是规范形式。复合文字是一种方便的替代形式。

z := make(map[int]string)
Run Code Online (Sandbox Code Playgroud)

z := map[int]string{}
Run Code Online (Sandbox Code Playgroud)

是等价的。

  • 据我了解,略有不同。代码 var z map[int]string 将生成 nil,其中其他两个代码 z := make(map[int]string) 和 z := map[int]string{} 将生成一个空切片。这三个可以用于范围循环等,但如果需要,您仍然可以检测到它们之间的差异。 (2认同)

Dmi*_*ski 5

make()空映射的函数和初始化器是相同的。

可以使用相同的语法来初始化空映射,其功能与使用 make 函数相同:

m = map[string]int{}

来自https://blog.golang.org/go-maps-in-action

使用指针作为映射键是有效的,因为指针是可比较的

但请记住,这些指针指向的值不会被检查:

指针值是可比较的。如果两个指针指向同一个变量或者两者的值都为 nil,则它们相等。指向不同的零大小变量的指针可能相等,也可能不相等。