Набор методов в Go
У указателя есть и методы значения, и методы
указателя. Набор методов типа описывает,
какие вызовы допустимы у значения и у
* на него. У переменной структуры
доступны только методы с получателем-значением,
у указателя на ту же структуру доступны оба
вида.
Возьмем адрес готового пользователя и вызовем оба метода через указатель:
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}
p := &u
fmt.Println(p.Title())
p.Birthday()
fmt.Println(u.Age)
Сначала на экране "ann", затем 21.
Метод с получателем User вызвали у
p типа *User: язык сам возьмет
значение для чтения. Метод с *User
изменил исходную переменную u через
тот же адрес.
Если бы у u вызывали только Title,
этого достаточно. Вызов Birthday у
значения тоже работает за счет автоматического
&, но набор методов удобнее помнить
отдельно для значения и для указателя.
Дана структура:
package main
import "fmt"
type User struct {
Name string
Age int
}
func (u User) Title() string {
return u.Name
}
func (u *User) Birthday() {
u.Age++
}
u := User{Name: "bob", Age: 30}
Запишите p := &u, вызовите чтение
имени через p, затем увеличьте
возраст через p и выведите возраст
u.
Дан следующий код:
package main
type Item struct {
Tag string
}
func (i Item) Tag() string {
return i.Tag
}
func (i *Item) Reset() {
i.Tag = ""
}
it := Item{Tag: "a"}
Создайте указатель на it, вызовите
оба метода через него и выведите поле
it.
Скажите, какие методы доступны у переменной
структуры, если есть и (User), и
(*User).