Пройти курс: Методы

Давайте поговорим о методах, или иногда их еще называют приемниками функций.

Технически, Go не является объектно-ориентированным языком программирования. В нем нет классов, объектов и наследования.

Однако в Go есть типы. И вы можете определять методы на типах.

Метод — это не что иное, как функция со специальным аргументом-приемником. Давайте посмотрим, как можно объявлять методы.

func (variable T) Name(params) (returnTypes) {}
Вход в полноэкранный режим Выйти из полноэкранного режима

Аргумент-приемник имеет имя и тип. Он появляется между ключевым словом func и именем метода.

Например, определим структуру Car.

type Car struct {
    Name string
    Year int
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Теперь определим метод IsLatest, который будет определять, был ли автомобиль произведен в течение последних 5 лет.

func (c Car) IsLatest() bool {
    return c.Year >= 2017
}
Вход в полноэкранный режим Выход из полноэкранного режима

Как видите, мы можем получить доступ к экземпляру Car с помощью переменной-приемника c. Мне нравится думать об этом как о ключевом слове this из объектно-ориентированного мира.

Теперь мы должны иметь возможность вызывать этот метод после инициализации нашей структуры, точно так же, как мы делаем это с классами в других языках.

func main() {
    c := Car{"Tesla", 2021}

    fmt.Println("IsLatest", c.IsLatest())
}
Вход в полноэкранный режим Выход из полноэкранного режима

Методы с приемниками указателей

Все примеры, которые мы рассматривали ранее, имели приемник значения.

С приемником значения метод работает с копией переданного ему значения. Поэтому любые изменения, сделанные с приемником внутри методов, не видны вызывающей стороне.

Например, давайте создадим еще один метод под названием UpdateName, который будет обновлять название Car.

func (c Car) UpdateName(name string) {
    c.Name = name
}
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь давайте запустим это.

func main() {
    c := Car{"Tesla", 2021}

    c.UpdateName("Toyota")
    fmt.Println("Car:", c)
}
Войти в полноэкранный режим Выход из полноэкранного режима
$ go run main.go
Car: {Tesla 2021}
Войти в полноэкранный режим Выход из полноэкранного режима

Похоже, что имя не было обновлено, поэтому теперь переключим наш приемник на стрелочный тип и попробуем снова.

func (c *Car) UpdateName(name string) {
    c.Name = name
}
Войти в полноэкранный режим Выход из полноэкранного режима
$ go run main.go
Car: {Toyota 2021}
Войти в полноэкранный режим Выход из полноэкранного режима

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

Свойства

Давайте также посмотрим на некоторые свойства методов!

  • Go достаточно умна, чтобы правильно интерпретировать наш вызов функции, и поэтому вызовы методов с приемниками указателей — это просто синтаксический сахар, предоставленный Go для удобства.
(&c).UpdateName(...)
Вход в полноэкранный режим Выход из полноэкранного режима
  • Мы можем опустить переменную часть приемника, если мы ее не используем.
func (Car) UpdateName(...) {}
Вход в полноэкранный режим Выход из полноэкранного режима
  • Методы не ограничиваются структурами, их можно использовать и с неструктурными типами.
package main

import "fmt"

type MyInt int

func (i MyInt) isGreater(value int) bool {
    return i > MyInt(value)
}

func main() {
    i := MyInt(10)

    fmt.Println(i.isGreater(5))
}
Вход в полноэкранный режим Выход из полноэкранного режима

Почему методы, а не функции?

Возникает вопрос, почему именно методы, а не функции?

Как всегда, на этот вопрос нет конкретного ответа, и ни в коем случае нельзя сказать, что одно лучше другого. Наоборот, их следует использовать соответствующим образом, когда возникает ситуация.

Одно, что я могу сказать прямо сейчас, это то, что методы помогают нам избежать конфликтов именования.

Поскольку метод привязан к определенному типу, мы можем использовать одни и те же имена методов для нескольких приемников.

Но вообще, это может сводиться к предпочтениям? Например, «вызовы методов гораздо легче читать и понимать, чем вызовы функций» или наоборот.


Эта статья является частью моего открытого курса по Go, доступного на Github.

karanpratapsingh / go-course

Освойте основы и расширенные возможности языка программирования Go

Курс по Go

Привет, добро пожаловать на курс, и спасибо за изучение Go. Я надеюсь, что этот курс обеспечит вам отличный опыт обучения.

Этот курс также доступен на моем сайте, а также на Educative.io

Оглавление

  • Начало работы

    • Что такое Go?
    • Зачем изучать Go?
    • Установка и настройка
  • Глава I

    • Hello World
    • Переменные и типы данных
    • Форматирование строк
    • Управление потоком данных
    • Функции
    • Модули
    • Рабочие пространства
    • Пакеты
    • Полезные команды
    • Сборка
  • Глава II

    • Указатели
    • Структуры
    • Методы
    • Массивы и фрагменты
    • Карты
  • Глава III

    • Интерфейсы
    • Ошибки
    • Паника и восстановление
    • Тестирование
    • Дженерики
  • Глава IV

    • Параллелизм
    • Гороутины
    • Каналы
    • Выбрать
    • Пакет синхронизации
    • Расширенные шаблоны параллелизма
    • Контекст
  • Приложение

    • Следующие шаги
    • Ссылки

Что такое Go?

Go (также известный как Golang) — это язык программирования, разработанный в Google в 2007 году и открытый в 2009 году.

Основное внимание в нем уделяется простоте, надежности и эффективности. Он был разработан, чтобы объединить эффективность, скорость и безопасность статически типизированного и компилируемого языка с легкостью…

Посмотреть на GitHub

Оцените статью
devanswers.ru
Добавить комментарий