golang の struct と method

はじめに

しばらくgoを書いていなかったので復習がてらgoの構造体の扱いをまとめます。

構造体にメソッドを生やす

データ構造に対して振る舞いを指定します。
今回は三角形の面積を求めるtriangleパッケージを作りました。

./triangle/triangle.go

package triangle

// 各フィールドを小文字で始めることでprivateな構造体
type Triangle struct {
    name   string
    bottom int
    height int
}

// いわゆるコンストラクタ。このパッケージを利用する関数内でNewする。
func New(name string, bottom, height int) *Triangle {
    return &Triangle{name: name, bottom: bottom, height: height}
}

// nameを返すメソッド。~.name のようにはアクセスできない(させない)のでこのメソッドを呼び出す。
func (t Triangle) Name() string {
    return t.name
}
// 面積を返すメソッド。
func (t Triangle) Area() int {
    return t.bottom * t.height / 2
}
// 参照渡し
func (t *Triangle) Scale(i int) {
    t.bottom = t.bottom * i
    t.height = t.height * i
}

これをimportしてmain関数で利用します。

./main.go

package main

import (
    "fmt"
    "~/triangle"
)

func main() {
    t := triangle.New("triangle01", 3, 5)
    t.Scale(2)

    fmt.Println(t.Name(), "Area is ", t.Area())
    // out is: triangle01 Area is  30
}

まとめ

やはりgoの構造体の取り回しは書いていて気持ちが良いですね。