Что такое метод в Go и чем он отличается от функции?

Ответ

Метод в Go — это функция, которая «привязана» к определённому типу-получателю (receiver). Основное отличие от обычной функции заключается в том, что метод вызывается на экземпляре этого типа и имеет доступ к его данным.

Ключевое отличие:

  • Функция: func DoSomething(args) — существует сама по себе.
  • Метод: func (t MyType) DoSomething(args) — принадлежит типу MyType.

Пример:

type Circle struct {
    Radius float64
}

// Метод Area для типа Circle. 'c' - это получатель (receiver).
func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

func main() {
    c := Circle{Radius: 5}
    // Метод вызывается через экземпляр структуры
    fmt.Println(c.Area())
}

Методы могут иметь два типа получателей:

  1. Получатель-значение ((c Circle)): Метод работает с копией объекта. Изменения внутри метода не повлияют на исходный объект.
  2. *Получатель-указатель (`(c Circle)`):** Метод работает с указателем на объект и может изменять его исходное состояние. Это более эффективно для больших структур, так как не происходит копирования.
// Метод с получателем-указателем
func (c *Circle) Scale(factor float64) {
    c.Radius *= factor // Изменяет оригинальную структуру
}