Если вы просто хотите вызвать функцию или метод, это не имеет значения, вы можете создать функцию с сигнатурой, где получатель является обычным, обычным параметром. Не будет никакого снижения производительности (могло бы быть, если бы методы могли быть виртуальными , но в Go нет никаких виртуальных методов).
Одним из преимуществ может быть«визуальная привлекательность». Вызов метода делает очевидным, что он принадлежит получателю. Я также считаю, что цепочечный код легче понять, если используются методы.
Сравните это решение без методов:
type Circle struct{}
type Point struct{}
func Center(Circle) Point { return Point{} }
func Abs(Point) float64 { return 0 }
func main() {
var c Circle
fmt.Println(Abs(Center(c)))
}
Abs(Center(c))
не настолько интуитивно понятен. Но если вы добавляете методы вместо использования функций:
func (Circle) Center() Point { return Point{} }
func (Point) Abs() float64 { return 0 }
func main() {
var c Circle
fmt.Println(c.Center().Abs())
}
c.Center().Abs()
легче понять.
Методы являются обязательными, если вы хотите реализовать интерфейсы. Если интерфейс содержит несколько методов, его могут реализовать только типы, у которых есть эти методы. См. Связанные: Зачем нужны интерфейсы в Golang? Следует также отметить, что вы можете создавать только методы, определенные в одном и том же пакете, поэтому, если вы хотите "вооружить" тип из другого пакета, вы можете'' использовать 'методы.
Одна вещь, которую я бы назвал "выгодой" для использования методов: вы не можете вызывать функции по имени, но вы можете обращаться и вызывать методы по имени. Подробнее см. Вызов функций со специальным префиксом / суффиксом .