1.18M

02_теория

1.

Методы
Привязка поведения к данным

2.

Что такое метод? Привязываем
поведение к данным
Метод — это функция, которая «привязана» к
определенному типу данных (чаще всего к
структуре). Она не существует сама по себе, она
всегда принадлежит своему типу.
Синтаксис:
func (переменная Тип) ИмяМетода(аргументы) (возвращаемые значения) {
// тело метода
}

3.

Ресивер-значение: Работаем с безопасной
копией
Оригинал останется
нетронутым
Когда вы вызываете метод с
ресивером-значением, Go создает
полную копию вашей структуры и
передает эту копию в метод. Любые
изменения, которые вы делаете
внутри метода с этой копией, не
повлияют на исходную структуру.
Это и есть ресиверзначение.
// s - это копия структуры
func (s MyStruct) MyMethod() { ... }

4.

Ресивер-значение: Когда это
использовать
Когда методу нужно только?
прочитать данные из структуры, не изменяя их. Например,
чтобы сформировать полное имя пользователя из его имени и фамилии.
Аналогия из C++
Это очень похоже на const методы,
которые гарантируют, что не изменят
состояние объекта.
Аналогия из
PHP/Java
Это как если бы объект всегда передавался
по значению, а не по ссылке.

5.

Ресивер-указатель: Меняем оригинал
Если он что-то
изменит, вы это сразу
увидите.
При вызове метода с ресиверомуказателем, Go не копирует всю
структуру. Он передает в метод
указатель. Любое изменение поля
структуры внутри метода изменит и
исходную структуру.
Это — ресиверуказатель. В
синтаксисе это
обозначается
звездочкой *
// s - это указатель (ссылка) на оригинал структуры
func (s *MyStruct) MyMethod() { ... }

6.

Ресивер-указатель: Когда это
использовать
Всегда, когда метод должен?
изменить состояние структуры. Например, деактивировать
пользователя (изменить поле IsActive на false) или выдать книгу (изменить поле IsIssued
на true).
Аналогия из
PHP/Java
Это стандартное поведение для методов
классов. Переменная $this (в PHP) или this (в
Java/JS) по сути является ссылкой на
текущий объект, и методы могут свободно
менять его состояние.

7.

Когда что использовать? Золотое
правило
Нужно ли методу изменять
структуру?
Да: Используйте ресивер-указатель
(*MyStruct).
Нет: Можно использовать ресивер-значение
(MyStruct).
Правило
консистентности
(согласованности):
Если хотя бы один метод для вашей
структуры использует ресиверуказатель, то для единообразия
лучше все методы для этой
структуры делать с ресиверомуказателем.
English     Русский Rules