Урок объясняет, что такое функции-получатели в Go, как работают value и pointer receivers, чем они отличаются, как receivers позволяют использовать точечную нотацию и улучшать API структур.
Функции-получатели позволяют привязывать методы к структурам и тем самым создавать более удобный и «объектный» стиль работы с данными. Они дают возможность использовать точечную нотацию, скрывать детали реализации и изменять состояние структуры.
Функция-получатель - это обычная функция, у которой появляется специальный аргумент‑получатель, записанный перед именем функции:
func (c Coordinate) Shift() { ... }
Получатель может быть: - значением (value receiver), - указателем (pointer receiver).
Это определяет, может ли метод изменять структуру.
type Coordinate struct {
X, Y int
}
Так выглядит обычная функция, которая изменяет структуру через указатель:
func shiftBy(x, y int, coord *Coordinate) {
coord.X += x
coord.Y += y
}
Использование:
coord := Coordinate{5, 5}
shiftBy(1, 1, &coord) // (6, 6)
Получатель‑указатель позволяет менять структуру напрямую:
func (coord *Coordinate) shiftBy(x, y int) {
coord.X += x
coord.Y += y
}
Использование:
coord := Coordinate{5, 5}
coord.shiftBy(1, 1) // (6, 6)
Отличительная особенность: вызывается через точечную нотацию.
Оба варианта работают, но:
Пример из слайда показывает, что вызов:
coord.shiftBy(1, 1)
меняет структуру так же, как:
shiftBy(1, 1, &coord)
Получатель‑значение не меняет структуру, потому что работает с копией:
func (c Coordinate) ShiftDist(other Coordinate) Coordinate {
return Coordinate{other.X - c.X, other.Y - c.Y}
}
Использование:
first := Coordinate{2, 2}
second := Coordinate{1, 5}
distance := first.ShiftDist(second) // {-1 3}
Value receiver удобен, когда: - метод не должен изменять структуру, - структура маленькая, - важна неизменность данных.
*T) позволяет изменять структуру.T) работает с копией, а не с оригиналом.