В чём разница между методом и функцией в Go?

Ответ

Ключевое отличие — наличие получателя (receiver).

Функция — это самостоятельный блок кода, который не привязан ни к какому типу. Она вызывается по имени пакета и своему имени.

Метод — это функция, которая "привязана" к конкретному типу данных через специальный аргумент, называемый получателем (receiver). Метод вызывается у экземпляра этого типа.

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

  1. Объявление: У метода перед именем указывается получатель в скобках func (r ReceiverType) MethodName() {}.
  2. Вызов: Функция вызывается напрямую (pkg.Func()), а метод — через переменную-получатель (variable.Method()).
  3. Доступ к данным: Метод имеет прямой доступ к полям своего типа-получателя.

Пример:

package main

import "fmt"

type User struct {
    Name string
}

// Метод типа User. 
// 'u' — это получатель (receiver).
func (u User) Greet() {
    fmt.Println("Hello from method, " + u.Name)
}

// Обычная функция, принимающая User как аргумент.
func GreetUser(u User) {
    fmt.Println("Hello from function, " + u.Name)
}

func main() {
    user := User{Name: "Alice"}

    // Вызов метода у экземпляра user
    user.Greet()

    // Вызов функции с передачей user в качестве аргумента
    GreetUser(user)
}

Когда что использовать?

  • Используйте метод, когда функция оперирует состоянием или поведением конкретного типа (например, user.ChangeEmail(), file.Close()).
  • Используйте функцию для утилитных операций, которые не зависят от состояния конкретного экземпляра (например, math.Max(), strings.Join()).