Ответ
Ключевое отличие — наличие получателя (receiver).
Функция — это самостоятельный блок кода, который не привязан ни к какому типу. Она вызывается по имени пакета и своему имени.
Метод — это функция, которая "привязана" к конкретному типу данных через специальный аргумент, называемый получателем (receiver). Метод вызывается у экземпляра этого типа.
Ключевые отличия:
- Объявление: У метода перед именем указывается получатель в скобках
func (r ReceiverType) MethodName() {}
. - Вызов: Функция вызывается напрямую (
pkg.Func()
), а метод — через переменную-получатель (variable.Method()
). - Доступ к данным: Метод имеет прямой доступ к полям своего типа-получателя.
Пример:
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()
).