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