Pointer receiver
Pointer receiver (получатель-указатель) в Go позволяет методу
изменять исходную структуру, так как метод получает указатель на
экземпляр структуры. При использовании указателя в качестве
получателя, внутри метода мы работаем с оригинальной структурой,
а не с ее копией. Это особенно полезно, когда метод должен
модифицировать поля структуры.
Синтаксис
func (s *StructType) MethodName(params) returnType {
// тело метода
}
В синтаксисе метода с указателем в качестве получателя
перед именем метода указывается переменная получателя
со звездочкой *StructType. Это означает, что метод
получает указатель на структуру и может изменять ее поля.
Пример изменения полей структуры
Давайте создадим структуру Person с методом
UpdateName, который изменяет имя с помощью
указателя:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p *Person) UpdateName(newName string) {
p.Name = newName
}
func main() {
person := Person{Name: "John", Age: 30}
person.UpdateName("Alice")
fmt.Println(person.Name)
}
Результат выполнения кода:
"Alice"
Метод UpdateName получает указатель на структуру
Person, поэтому изменение поля Name отражается
на исходной переменной.
Пример со значением по умолчанию
Давайте добавим метод SetDefaultAge, который
устанавливает возраст по умолчанию, если он не указан:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p *Person) SetDefaultAge() {
if p.Age == 0 {
p.Age = 18
}
}
func main() {
person := Person{Name: "Bob"}
person.SetDefaultAge()
fmt.Println(person.Age)
}
Результат выполнения кода:
18
Метод SetDefaultAge изменяет поле Age, если оно
равно нулевому значению. Благодаря указателю изменения
сохраняются в исходной структуре.
Пример возврата измененной структуры
Метод с указателем может не только изменять поля, но и
возвращать модифицированную структуру. Рассмотрим метод
IncrementAge, который увеличивает возраст на
заданное значение:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func (p *Person) IncrementAge(years int) Person {
p.Age += years
return *p
}
func main() {
person := Person{Name: "Charlie", Age: 25}
updated := person.IncrementAge(5)
fmt.Println(updated.Age)
}
Результат выполнения кода:
30
Метод IncrementAge изменяет исходную структуру
и возвращает ее копию. Это удобно, когда нужно и
изменить, и получить результат.
Смотрите также
-
статью
Value receiver,
которая описывает получатель-значение для методов структуры -
статью
Методы структур,
в которой рассматриваются методы структур в целом -
статью
Указатели на структуры,
которая описывает работу с указателями на структуры -
статью
Доступ к полям структуры,
которая описывает работу с полями структур