Указатель на карту - PullRequest
42 голосов
/ 11 мая 2010

Некоторые карты определены как:

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

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

valueTo := &valueToSomeType
nameTo := &nameToSomeType

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

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

Редактировать

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

Ответы [ 3 ]

92 голосов
/ 11 мая 2010

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

44 голосов
/ 10 августа 2012

Более конкретно, из Golang Specs :

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

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

0 голосов
/ 10 апреля 2019

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

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

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 ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...