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

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

Sobes Copilot

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

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

sobes.tech AI

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

Основные следствия этого:

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

Пример:

package main

import "fmt"

type Counter struct {
	value int
}

// Метод с ресивером-значением: не меняет оригинальный Counter
func (с Counter) IncrementByValue() {
	с.value++ // Изменяется только копия
}

// Метод с ресивером-указателем: меняет оригинальный Counter
func (с *Counter) IncrementByPointer() {
	с.value++ // Изменяется оригинальное значение
}

func main() {
	c1 := Counter{value: 0}
	c1.IncrementByValue()
	fmt.Println("Value after IncrementByValue:", c1.value) // Выведет 0

	c2 := Counter{value: 0}
	c2.IncrementByPointer()
	fmt.Println("Value after IncrementByPointer:", c2.value) // Выведет 1
}