Подтвердить что ты не робот

Указатель на карту

Имея некоторые карты, определенные как:

var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}

Мне нужна переменная, указывающая на адрес карт (чтобы не копировать всю переменную). Я попробовал это, используя:

valueTo := &valueToSomeType
nameTo := &nameToSomeType

но при использовании valueTo[number] он показывает, внутренняя ошибка компилятора: var без типа, init: new

Как это получить?

Изменить

Ошибка была обнаружена другой проблемой.

4b9b3361

Ответ 1

Карты являются ссылочными типами, поэтому они всегда передаются по ссылке. Вам не нужен указатель.

Ответ 2

В частности, из Golang Specs:

Слои, карты и каналы ссылочные типы, которые не требуют дополнительной косвенности выделения с помощью new.
Встроенная функция make принимает тип T, который должен быть фрагментом, картой или типом канала, необязательно сопровождаемым списком выражений типа.
Он возвращает значение типа T (не *T).
Память инициализируется, как описано в разделе о начальных значениях

Однако в отношении вызовов функций параметры передаются по значению (всегда).
За исключением значения параметра map является указателем.

Ответ 3

@Мой ответ правильный.

Для проверки достаточно простой программы:

package main

import "fmt"

func main() {
    m := make(map[string]string, 10)
    add(m)
    fmt.Println(m["tom"]) // expect nil ???
}

func add(m map[string]string) {
    m["tom"] = "voldemort"
}

Выход этой программы

voldemort

Если карта была передана по значению, то добавление к карте в функции add() не будет иметь никакого эффекта в основном методе. Но мы видим добавленную стоимость методом add(). Это подтверждает, что указатель карты передается методу add().