Получатель-значение в Go
Получатель ставят между словом func
и именем метода. Метод на структуре записывают
рядом с типом в том же файле: в скобках имя
переменной и тип, как у параметра. Так метод
знает, с каким значением работать при каждом
вызове.
Если в скобках указан тип без звездочки, получатель передается по значению. Внутри метода видна копия структуры, а не исходная переменная снаружи. Запишем метод, который пытается изменить возраст:
type User struct {
Name string
Age int
}
func (u User) TryAge() {
u.Age = 21
}
Создадим значение и вызовем метод:
u := User{Name: "ann", Age: 20}
u.TryAge()
fmt.Println(u.Age)
На экране по-прежнему 20. Присваивание
внутри метода попало в копию u, а поле
исходной переменной не изменилось. Такой
получатель удобен, когда метод только читает
данные и не должен менять исходное значение.
Тот же прием с получателем-значением подойдет для методов, которые возвращают текст из полей, сравнивают части структуры или печатают краткую сводку без записи обратно в переменную.
Дана структура:
package main
import "fmt"
type User struct {
Name string
Age int
}
u := User{Name: "bob", Age: 30}
Добавьте метод с получателем-значением, который
ставит возраст равным 99, вызовите его
и выведите возраст u.
Дан следующий код:
package main
type Score struct {
Points int
}
func (s Score) Bump() {
s.Points = s.Points + 1
}
Создайте значение с 5 очками, вызовите
Bump и выведите очки после вызова.
Скажите, изменится ли поле снаружи, если получатель метода записан без звездочки, а внутри меняют строковое поле.