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

Получатель-указатель в 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?

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