为什么Go中的地图最初会根据地图的大小而具有空值?

use*_*932 3 go

希望更好地理解地图。

给出以下代码:

package main

import "fmt"

type Vertex struct {
    Lat, Long float64
}

var m []map[string]Vertex
var m1 map[string]Vertex

func main() {
    m = make([]map[string]Vertex, 3)
    m1 = make(map[string]Vertex)
    m1["Bell Labs"] = Vertex{
        40.68433, -74.39967,
    }
    m = append(m, m1)
    fmt.Println(m)
    fmt.Println(len(m))
    fmt.Println(m[3]["Bell Labs"])
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出

[map[] map[] map[] map[Bell Labs:{40.68433 -74.39967}]]
4
{40.68433 -74.39967}
Run Code Online (Sandbox Code Playgroud)

为什么数组中的前3个元素是空/空映射,为什么不打印出来[map[Bell Labs:{40.68433 -74.39967}]]呢?

pet*_*rSO 8

为什么数组中的前3个元素是空/空映射?


Go编程语言规范

制作切片,地图和通道

内置函数make的类型为T,该类型必须为slice,map或channel类型,并可以选择后面跟特定类型的表达式列表。它返回类型T的值(不是* T)。存储器按照有关初始值的部分中所述进行初始化。

Call             Type T     Result

make(T, n)       slice      slice of type T with length n and capacity n
make(T, n, m)    slice      slice of type T with length n and capacity m
Run Code Online (Sandbox Code Playgroud)

切片mmap

m = make([]map[string]Vertex, 3)
Run Code Online (Sandbox Code Playgroud)

相当于

m = make([]map[string]Vertex, 3, 3)
Run Code Online (Sandbox Code Playgroud)

它应该是

m = make([]map[string]Vertex, 0, 3)
Run Code Online (Sandbox Code Playgroud)

例如,

package main

import "fmt"

type Vertex struct {
    Lat, Long float64
}

var m []map[string]Vertex
var m1 map[string]Vertex

func main() {
    m = make([]map[string]Vertex, 0, 3)
    fmt.Println(len(m), cap(m))
    m1 = make(map[string]Vertex)
    m1["Bell Labs"] = Vertex{
        40.68433, -74.39967,
    }
    m = append(m, m1)
    fmt.Println(m)
    fmt.Println(len(m), cap(m))
    fmt.Println(m[0]["Bell Labs"])
}
Run Code Online (Sandbox Code Playgroud)

游乐场:https//play.golang.org/p/i9f0rrCrtY_5

输出:

0 3
[map[Bell Labs:{40.68433 -74.39967}]]
1 3
{40.68433 -74.39967}
Run Code Online (Sandbox Code Playgroud)