Некоторые типы в Go являются ссылочными типами: карты, срезы, каналы, функции и методы.Перейти: ссылочные типы в качестве аргументов
Иногда вам нужно использовать указатели для ссылок. Например,
type Stack []interface{}
func (stack *Stack) Push(x interface{}) {
*stack = append(*stack, x)
}
Вам это нужно, потому что все аргументы передаются путем копирования значения, и append()
может понадобиться перераспределить память емкостью Срез не является достаточно большим. Я понимаю.
Первый вопрос. Как насчет map
? Если у меня есть пользовательский тип, основанный на map
, должен ли я лучше всегда передать указатель на него, если ожидается какой-либо ключ: значения вставки или удаления значений?
Второй вопрос. Как насчет других ссылочных типов? Channel
, например. Я могу представить ситуацию, когда я создаю настраиваемый тип на основе канала для реализации некоторой пользовательской предварительной обработки для значений, передаваемых каналу. Нужны и указатели?
Извините, если это базовое значение, но я действительно хочу получить хорошее представление о предмете.
Вы вводите в заблуждение дескриптор среза с базовым массивом. В Go нет ссылочных типов. У вас есть ценности, у вас есть указатели. Указатель - это «ссылка». И я не знаю, что делает ваш образец кода, но это, безусловно, не обязательно. Стоит прочитать http://blog.golang.org/go-slices-usage-and-internals – evanmcdonnal
@evanmcdonnal: no, для которого требуется указатель, потому что append может выделять новый массив, изменяя внутренний указатель данных, а также и значения len и cap. http://play.golang.org/p/Cm8AQXpK5J – JimB
@ JimB да, я заметил, что, возившись с ним на детской площадке. Однако эта необходимость вызвана глупой конструкцией. Просто определите метод с получателем и возвращаете тип 'Stack' и выполните' myStack = myStack.Push (x) '. Или еще лучше, не определяйте ничего из этого, потому что это всего лишь пустая трата вашей системной ОЗУ. Как единственная причина, по которой это происходит, связано с тем, что append обрабатывается дескриптором среза как значение, возвращая новое после завершения действия. Затем он делает что-то непоследовательное в создании своего типа, который представляет собой не что иное, как цепочку фрагментов, метод с использованием указателя. – evanmcdonnal