Ответ 1
Карты являются ссылочными типами, поэтому они всегда передаются по ссылке. Вам не нужен указатель.
Имея некоторые карты, определенные как:
var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}
Мне нужна переменная, указывающая на адрес карт (чтобы не копировать всю переменную). Я попробовал это, используя:
valueTo := &valueToSomeType
nameTo := &nameToSomeType
но при использовании valueTo[number]
он показывает,
внутренняя ошибка компилятора: var без типа, init: new
Как это получить?
Изменить
Ошибка была обнаружена другой проблемой.
Карты являются ссылочными типами, поэтому они всегда передаются по ссылке. Вам не нужен указатель.
В частности, из Golang Specs:
Слои, карты и каналы ссылочные типы, которые не требуют дополнительной косвенности выделения с помощью
new
.
Встроенная функция make принимает типT
, который должен быть фрагментом, картой или типом канала, необязательно сопровождаемым списком выражений типа.
Он возвращает значение типаT
(не*T
).
Память инициализируется, как описано в разделе о начальных значениях
Однако в отношении вызовов функций параметры передаются по значению (всегда).
За исключением значения параметра map является указателем.
@Мой ответ правильный.
Для проверки достаточно простой программы:
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().