Ответ
Использование receiver без указателя (pointer) в Go имеет свои преимущества и недостатки:
Плюсы:
- Безопасность: неизменяемость данных, так как метод работает с копией структуры.
- Потокобезопасность: отсутствие гонок данных при параллельном доступе.
- Простота: не нужно заботиться о передаче указателей и возможных
nil-значениях.
Минусы:
- Производительность: копирование больших структур может быть затратным.
- Неизменяемость: невозможность модифицировать оригинальную структуру.
Пример:
type Point struct { X, Y int }
// Value receiver
func (p Point) Move(dx, dy int) Point {
return Point{p.X + dx, p.Y + dy} // Возвращает новую структуру
}
p := Point{1, 2}
p = p.Move(3, 4) // Оригинальный p не изменился