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

Получатель-значение в Go

Получатель ставят между словом func и именем метода. Метод на структуре записывают рядом с типом в том же файле: в скобках имя переменной и тип, как у параметра. Так метод знает, с каким значением работать при каждом вызове.

Если в скобках указан тип без звездочки, получатель передается по значению. Внутри метода видна копия структуры, а не исходная переменная снаружи. Запишем метод, который пытается изменить возраст:

type User struct { Name string Age int } func (u User) TryAge() { u.Age = 21 }

Создадим значение и вызовем метод:

u := User{Name: "ann", Age: 20} u.TryAge() fmt.Println(u.Age)

На экране по-прежнему 20. Присваивание внутри метода попало в копию u, а поле исходной переменной не изменилось. Такой получатель удобен, когда метод только читает данные и не должен менять исходное значение.

Тот же прием с получателем-значением подойдет для методов, которые возвращают текст из полей, сравнивают части структуры или печатают краткую сводку без записи обратно в переменную.

Дана структура:

package main import "fmt" type User struct { Name string Age int } u := User{Name: "bob", Age: 30}

Добавьте метод с получателем-значением, который ставит возраст равным 99, вызовите его и выведите возраст u.

Дан следующий код:

package main type Score struct { Points int } func (s Score) Bump() { s.Points = s.Points + 1 }

Создайте значение с 5 очками, вызовите Bump и выведите очки после вызова.

Скажите, изменится ли поле снаружи, если получатель метода записан без звездочки, а внутри меняют строковое поле.

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