Go за Прикладом: Методи

Go підтримує методи визначені на типі структура.

package main
import "fmt"

Ось - ми визначимо наш тип.

type rect struct {
    width, height int
}

Функція area (площа) являє собою метод типу rect, або як кажуть з отримувачем типу rect.

func (r *rect) area() int {
    return r.width * r.height
}

Методи можуть визначатись для отримувачів типу вказівник або значення. Ось приклад метода з отримувачем типу значення. Методи з таким типом не змінюють значення стуктури.

func (r rect) perim() int {
    return 2*r.width + 2*r.height
}
func main() {
    r := rect{width: 10, height: 5}

Тут ми викличемо 2 методи визначені для нашої структури.

    fmt.Println("area: ", r.area())
    fmt.Println("perim:", r.perim())

Go автоматично визначає чи потрібне конвертування між значеннями та вказівниками для виклику методів. Можливо вам заманеться використати отримувач-вказівник, щоб уникнути копіювання даних при виклику методу або для зміни даних в структурі.

    rp := &r
    fmt.Println("area: ", rp.area())
    fmt.Println("perim:", rp.perim())
}
$ go run methods.go
area:  50
perim: 30
area:  50
perim: 30

В наступному прикладі ми розглянемо інтерфейси - механізм Go, для австрації, групування та іменування споріднених множин методів.

Наступний приклад: Інтерфейси (Interfaces).