Go by Example: Methods

Go は構造体型に定義する メソッド (methods) をサポートします。

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

この area メソッドは、 *rectレシーバ型 (receiver type) としてもちます。

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 の仕組みとして、インターフェースを見ていきます。

Next example: Interfaces.