Что такое метод? Как они выглядят?go-32

Что такое метод в Go?

Метод — это функция, привязанная к конкретному типу (чаще всего к структуре). Методы позволяют добавлять поведение к пользовательским типам данных, реализуя принципы объектно-ориентированного программирования.

Ключевые особенности методов:

  • Связывают функцию с конкретным типом
  • Имеют получатель (receiver) — указание на тип, к которому они привязаны
  • Могут быть объявлены для любого типа, определенного в том же пакете
  • Вызываются через экземпляр типа

Синтаксис методов

Базовый синтаксис объявления метода:

func (receiver ReceiverType) MethodName(parameters) (returnTypes) {
    // тело метода
}

Пример метода для структуры:

type Circle struct {
    Radius float64
}

// Метод для вычисления площади
func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

Типы получателей

1. Value receiver

func (c Circle) Perimeter() float64 {
    return 2 * math.Pi * c.Radius
}

2. Pointer receiver

func (c *Circle) Scale(factor float64) {
    c.Radius *= factor
}

Различия между value и pointer receivers

Характеристика Value Receiver Pointer Receiver
Работает с Копией объекта Оригинальным объектом
Модификация полей Не сохраняется Сохраняется
Вызов Работает для value и ptr Работает для value и ptr
Выделение памяти Копирование Работает с ссылкой

Пример использования методов

package main

import (
    "fmt"
    "math"
)

type Rectangle struct {
    Width, Height float64
}

// Value receiver метод
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

// Pointer receiver метод
func (r *Rectangle) Scale(ratio float64) {
    r.Width *= ratio
    r.Height *= ratio
}

func main() {
    rect := Rectangle{10, 5}

    fmt.Println("Area:", rect.Area()) // 50

    rect.Scale(2)
    fmt.Println("New area:", rect.Area()) // 200
}

Особенности методов в Go

  1. Методы для любых типов (не только структур):
type MyFloat float64

func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}
  1. Вызов метода через указатель или значение:
rect := &Rectangle{10, 5}
area := rect.Area() // Работает, хотя Area() имеет value receiver
  1. Методы с несколькими возвращаемыми значениями:
func (r Rectangle) Dimensions() (float64, float64) {
    return r.Width, r.Height
}
  1. Цепочка методов (при использовании pointer receivers):
func (r *Rectangle) Double() *Rectangle {
    r.Scale(2)
    return r
}

rect.Double().Scale(0.5)

Отличие методов от функций

  1. Синтаксис вызова:
// Функция
area := Area(rect)

// Метод
area := rect.Area()
  1. Привязка к типу (методы принадлежат типам)
  2. Наличие получателя (receiver)

Резюмируем

  • Методы — функции, привязанные к конкретным типам
  • Синтаксис: func (receiver) MethodName() {...}
  • Два типа receivers:
    • Value receiver (работает с копией)
    • Pointer receiver (работает с оригиналом)
  • Могут быть объявлены для любых пользовательских типов
  • Позволяют реализовывать ООП-подход в Go
  • Отличаются от функций наличием получателя и способом вызова
  • Pointer receivers позволяют модифицировать оригинальный объект