Приемник указателя Голанга против получателя значения
Ситуация:
Я узнал о получателях указателей и получателях значений. Из того, что я понимаю: если вы хотите изменить сам объект, вам нужно использовать указатель приемника. Я читал больше об интерфейсах в документации go и нашел этот кусок кода:
type Sequence []int
// Methods required by sort.Interface.
func (s Sequence) Len() int {
return len(s)
}
func (s Sequence) Less(i, j int) bool {
return s[i] < s[j]
}
func (s Sequence) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
Less
а такжеLen
методы используют получатели значений, и это имеет смысл, потому что они возвращают данные, а не изменяютSequence
государство.Но в
Swap
Например, мне любопытно, почему он все еще использует получатель значения, когда он выглядит так, как будто пытается изменить свое состояние.
Вопрос:
Это ошибка, или мое понимание получателей значения / указателя неверно?
1 ответ
Чтобы немного расширить комментарий @squiguy, значение объекта среза само по себе является ссылкой на базовый массив, включая указатель на элемент в массиве, с которого начинается срез, длину среза и емкость среза (количество элементов в базовом массиве от начала среза до конца массива). Когда вы передаете срез функции, эта информация передается по значению, поэтому срез внутри функции все еще ссылается на тот же базовый массив. Вот как Swap
может поменять местами элементы в срезе, даже если сам срез передается по значению.