Метод — это функция, привязанная к конкретному типу (чаще всего к структуре). Методы позволяют добавлять поведение к пользовательским типам данных, реализуя принципы объектно-ориентированного программирования.
Базовый синтаксис объявления метода:
func (receiver ReceiverType) MethodName(parameters) (returnTypes) {
// тело метода
}
type Circle struct {
Radius float64
}
// Метод для вычисления площади
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * math.Pi * c.Radius
}
func (c *Circle) Scale(factor float64) {
c.Radius *= factor
}
Характеристика | 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
}
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
rect := &Rectangle{10, 5}
area := rect.Area() // Работает, хотя Area() имеет value receiver
func (r Rectangle) Dimensions() (float64, float64) {
return r.Width, r.Height
}
func (r *Rectangle) Double() *Rectangle {
r.Scale(2)
return r
}
rect.Double().Scale(0.5)
// Функция
area := Area(rect)
// Метод
area := rect.Area()
func (receiver) MethodName() {...}