Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpMtMS 11 of 280 menu
◀ ▶

Набор методов в 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).

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить