Определение методов структур
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 7 из 107.
Методы в Go — это функции со специальным аргументом receiver, который связывает функцию с типом структуры (struct).
Синтаксис метода
func (receiverName StructType) MethodName() ReturnType {
// тело метода
}Определите структуру с методами
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}Методы с параметрами
func (r Rectangle) Scale(factor float64) float64 {
return r.Area() * factor
}Вызов методов
rect := Rectangle{Width: 5, Height: 3}
fmt.Println(rect.Area()) // Вывод: 15
fmt.Println(rect.Perimeter()) // Вывод: 16
fmt.Println(rect.Scale(2)) // Вывод: 30Получатель (r Rectangle) позволяет вам обращаться к полям структуры внутри метода, используя переменную получателя r. Методы могут вызывать другие методы той же структуры.
Задание
СреднеДобавьте три метода к структуре Circle:
Area— возвращаетmath.Pi * radius * radiusCircumference— возвращает2 * math.Pi * radiusDescribe— возвращает строку:"Circle with radius X.XX"
Шпаргалка
Методы в Go — это функции со специальным аргументом-получателем (receiver), который связывает функцию с типом структуры.
Синтаксис метода:
func (receiverName StructType) MethodName() ReturnType {
// тело метода
}Пример со структурой и методами:
type Rectangle struct {
Width float64
Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}Методы могут принимать параметры:
func (r Rectangle) Scale(factor float64) float64 {
return r.Area() * factor
}Вызов методов:
rect := Rectangle{Width: 5, Height: 3}
fmt.Println(rect.Area()) // Вывод: 15
fmt.Println(rect.Perimeter()) // Вывод: 16
fmt.Println(rect.Scale(2)) // Вывод: 30Получатель позволяет обращаться к полям структуры внутри метода. Методы могут вызывать другие методы той же структуры.
Попробуйте сами
package main
import "fmt"
func main() {
var radius float64
fmt.Scan(&radius)
c := Circle{Radius: radius}
fmt.Printf("Area: %.2f\n", c.Area())
fmt.Printf("Circumference: %.2f\n", c.Circumference())
fmt.Printf("Description: %s\n", c.Describe())
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП в Go
Внешние файлыРабочее пространство и модули GoПакеты и импортыЭкспортируемые и неэкспортируемые именаВведение в ООП в GoСтруктуры как классыОпределение методов структурПолучатели-указатели и получатели-значенияИнициализация структурФункции-конструкторыИтоги — Простой калькулятор4Интерфейсы
Введение в интерфейсыНеявная реализацияИнтерфейс как контрактПустой интерфейс (any)Утверждение типаПереключатель типовКомпозиция интерфейсовИнтерфейсы Stringer и ErrorПовторение: Калькулятор фигур7Инкапсуляция
Экспортируемые и неэкспортируемые поляИнкапсуляция на уровне пакетовГеттеры и сеттерыСокрытие информации в GoИтоги — Записи о студентах10Обобщения (Generics) (Go 1.18+)
Введение в GenericsПараметры типовОграничения типовОбобщенные структурыОбходной путь для обобщенных методовИтоги — Обобщенная коллекция13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн Abstract FactoryПаттерн ObserverПаттерн Strategy2Глубокое погружение в типы и структуры
Базовые и составные типыОпределение пользовательских типовТеги структурАнонимные структурыВложенные структурыНулевые значения и значения по умолчаниюПовторение — Контактная книга5Композиция вместо наследования
Почему в Go нет наследованияОсновы встраивания структурПродвижение методовВстраивание нескольких структурВстраивание против агрегацииЗатенение встроенных методовИтоги — Иерархия сотрудников8Обработка ошибок и ООП
Интерфейс errorПользовательские типы ошибокОбертывание ошибок (fmt.Errorf)Sentinel-ошибкиerrors.Is() и errors.As()Panic, Defer и RecoverИтоги — Парсер файлов11Стандартная библиотека и ООП
io.Reader и io.Writersort.InterfaceИнтерфейс fmt.Stringerencoding/json со структурамиИнтерфейс http.HandlerПовторение: модели REST API14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикMiddleware как Декоратор3Указатели и память
Основы указателей в GoУказатели на структурыПередача по значению и по ссылкеФункция new()Сборка мусора в GoПовторение: Конструктор связного списка6Полиморфизм в Go
Полиморфизм через интерфейсыУтиная типизация в GoПравила реализации интерфейсовПолиморфные коллекцииВнедрение зависимостейИтоги — Обработчик платежей9Конкурентность и ООП
Основы горутинКаналы и взаимодействиеБуферизованные и небуферизованные каналыОператор selectsync.Mutex и sync.RWMutexsync.WaitGroupПроектирование потокобезопасных структурПовторение — Worker Pool