Получатель-указатель в Go
Чтобы метод менял исходное значение, получателем
ставят указатель. В скобках перед именем метода
пишут * перед типом, как у параметра-указателя.
Тогда внутри метод работает с тем же значением
в памяти, что и переменная снаружи.
Увеличим возраст пользователя на единицу:
type User struct {
Name string
Age int
}
func (u *User) Birthday() {
u.Age++
}
Создадим значение и вызовем метод:
u := User{Name: "ann", Age: 20}
u.Birthday()
fmt.Println(u.Age)
На экране 21. Перед вызовом не пишут
& вручную: если u адресуемая
переменная, язык сам передаст указатель
методу с получателем *User.
Тот же метод можно вызвать у переменной, которая уже хранит указатель. Тогда точка идет после имени указателя, а звездочку перед вызовом не добавляют:
type User struct {
Name string
Age int
}
func (u *User) Birthday() {
u.Age++
}
Создадим указатель и вызовем метод:
u := &User{Name: "ann", Age: 20}
u.Birthday()
fmt.Println(u.Age)
Дана структура:
package main
import "fmt"
type User struct {
Name string
Age int
}
u := User{Name: "bob", Age: 30}
Добавьте метод с указателем, который увеличивает
возраст на 1, вызовите его два раза
и выведите возраст.
Даны переменные:
package main
import "fmt"
type Tank struct {
Level int
}
t := &Tank{Level: 5}
Запишите метод с указателем, который прибавляет
3 к уровню, вызовите его и выведите
поле.
Нужно ли писать &u перед точкой, если
u обычная переменная структуры, а
метод объявлен с *User?