Чтение и запись поля в Go
Поле удобно читать и менять отдельными
методами, без прямого доступа снаружи в этом
уроке. Одно действие возвращает текущее значение
поля, другое записывает новое. Так сценарий
в main опирается на имена действий,
а не на список полей структуры.
Для чтения хватит получателя-значения, для записи нужен указатель, иначе изменение останется в копии. Запишем оба метода у пользователя:
type User struct {
Name string
Age int
}
func (u User) Name() string {
return u.Name
}
func (u *User) SetName(name string) {
u.Name = name
}
Создадим значение и вызовем оба метода:
u := User{Name: "ann", Age: 20}
fmt.Println(u.Name())
u.SetName("amy")
fmt.Println(u.Name())
Сначала на экране "ann", затем "amy".
Вызов без звездочки у u для записи
сработал, потому что переменная адресуемая
и язык сам передает указатель методу с
получателем *User.
Внутри метода чтения имя Name у метода
и поле Name у структуры различаются
по месту в объявлении: метод вызывают со
скобками, поле читают через точку без них.
Дана структура:
package main
import "fmt"
type User struct {
Name string
Age int
}
u := User{Name: "bob", Age: 30}
Добавьте метод чтения имени и метод записи
имени с указателем. Смените имя на "ben"
и выведите результат чтения.
Дан тип Score с полем Points.
Запишите метод, который возвращает очки,
и метод с указателем, который добавляет
10 к полю. Проверьте оба на одной
переменной.
Почему для записи поля в этом приеме получатель записывают со звездочкой?