Приемник указателя Голанга против получателя значения

Ситуация:

Я узнал о получателях указателей и получателях значений. Из того, что я понимаю: если вы хотите изменить сам объект, вам нужно использовать указатель приемника. Я читал больше об интерфейсах в документации 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 может поменять местами элементы в срезе, даже если сам срез передается по значению.

Другие вопросы по тегам