Выбор получателя в Go
Получатель-значение годится, когда метод только читает, а указатель нужен, когда поля меняются. На одном типе часто сочетают оба варианта: легкие действия без записи и отдельные методы для обновления состояния.
Сначала выведем подпись без изменения возраста:
type User struct {
Name string
Age int
}
func (u User) Title() string {
return u.Name
}
Создадим значение и выведем подпись:
u := User{Name: "ann", Age: 20}
fmt.Println(u.Title())
fmt.Println(u.Age)
После вызова возраст остался 20. Тот
же тип дополним методом с указателем:
type User struct {
Name string
Age int
}
func (u User) Title() string {
return u.Name
}
func (u *User) Birthday() {
u.Age++
}
Создадим значение и вызовем метод с указателем:
u := User{Name: "ann", Age: 20}
u.Birthday()
fmt.Println(u.Age)
Теперь на экране 21. Оба метода живут
рядом, но роль разная: один возвращает данные,
другой меняет поле исходной переменной.
Дана структура:
package main
import "fmt"
type User struct {
Name string
Age int
}
u := User{Name: "bob", Age: 30}
Добавьте метод чтения имени с получателем-значением и метод увеличения возраста с указателем. Выведите имя, затем измените возраст и выведите его снова.
Дан тип Wallet с полем Balance.
Запишите метод, который возвращает баланс
без звездочки, и метод с указателем, который
прибавляет 100. Проверьте, что
баланс меняется только после второго.
Когда для метода, который меняет поле структуры, достаточно получателя-значения?