Назад к вопросам
Junior
129
questionbank
Что означает наличие звёздочки у ресивера в Go?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Наличие звёздочки (*) у ресивера в Go означает, что метод вызывается на указателе на экземпляр типа, а не на самой значение типа.
Основные следствия этого:
- Изменение состояния: Метод с ресивером-указателем может изменять поля структуры (или другого типа), на которую указывает ресивер. Без звёздочки метод работает с копией значения, и изменения внутри метода не отражаются на оригинале.
- Производительность: Передача указателя может быть более эффективной, чем передача большой структуры по значению, так как передается только адрес памяти, а не вся структура.
- 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
}