Goによる例: 方法

Goは、構造体で定義されたメソッドをサポートしています。

package main
import "fmt"
type rect struct {
    width, height int
}

このareaメソッドは、レシーバー型*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の機構であるインターフェイスを見ていきます。

次の例: インターフェイス