Почему карты в Go изначально имеют пустые значения в зависимости от размера карты? - PullRequest
3 голосов
/ 10 мая 2019

Надеясь лучше понять карты в 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"])
}

Я получаю вывод

[map[] map[] map[] map[Bell Labs:{40.68433 -74.39967}]]
4
{40.68433 -74.39967}

Почему первый3 элемента в массиве являются пустыми / нулевыми картами, разве он не должен выводить [map[Bell Labs:{40.68433 -74.39967}]] вместо этого?

1 Ответ

8 голосов
/ 10 мая 2019

Почему первые 3 элемента в массиве являются пустыми / нулевыми картами?


Спецификация языка программирования Go

Создание срезов, карт и каналов

Встроенная функция make принимает тип T, который должен быть типом среза, карты или канала, за которым может следовать типсписок выражений.Возвращает значение типа 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

Срез m из map

m = make([]map[string]Vertex, 3)

эквивалентен

m = make([]map[string]Vertex, 3, 3)

должно быть

m = make([]map[string]Vertex, 0, 3)

Например,

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"])
}

Детская площадка: https://play.golang.org/p/i9f0rrCrtY_5

Выход:

0 3
[map[Bell Labs:{40.68433 -74.39967}]]
1 3
{40.68433 -74.39967}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...