Назад к вопросам
Junior
103
questionbank

Что означает наличие звёздочки у ресивера в языке Go?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Наличие звёздочки * у ресивера в Go означает, что метод работает с указателем на экземпляр структуры, а не с его копией.

Последствия этого:

  1. Изменение состояния: Метод может изменять поля самого экземпляра структуры, а не только его копии.
  2. Производительность: Передача указателя обычно быстрее, чем копирование больших структур, особенно при вызове из цикла.
  3. Согласованность интерфейсов: При реализации интерфейса, если одним из методов требуется изменять состояние структуры (использует указатель-ресивер), то все методы, реализующие этот интерфейс, должны использовать указатель-ресивер для данного типа.

Пример: Изменение поля структуры с указателем-ресивером:

type Counter struct {
	Value int
}

// Increment изменяет Value напрямую, так как ресивер - указатель
func (c *Counter) Increment() {
	c.Value++
}

// GetValue работает с копией Counter (хоть и не модифицирует),
// но для консистентности с Increment, который меняет состояние,
// тоже часто используют указатель-ресивер в таких случаях.
func (c *Counter) GetValue() int {
	return c.Value
}

Пример без указателя-ресивера:

type Counter struct {
	Value int
}

// IncrementCopy работает с копией Counter, Value в исходном экземпляре не изменится
func (c Counter) IncrementCopy() {
	c.Value++
}