0xf

日記だよ

golangのメソッドセットは実体の型にくっついてる

まあそれはそう、という感じではあるけど頭から抜けていた。

package main

type F interface {
    Apply()
}

type f1 struct {
}

type f2 struct {
}

func (f1) Apply() {
    println("call f1!!!")
}

func (f2) Apply() {
    println("call f2!!!")
}

func build(p int) F {
    switch {
    case p % 2 == 0:
        return &f1{}
    default:
        return &f2{}
    }
}

func main() {
    var f F
    for i := 0; i <= 10; i++ {
        f = build(i)
        f.Apply()
    }
}

この実行結果は以下のようになる

call f1!!!
call f2!!!
call f1!!!
call f2!!!
call f1!!!
call f2!!!
call f1!!!
call f2!!!
call f1!!!
call f2!!!
call f1!!!

それはそうですね。

これを利用してファクトリーメソッドパターンを実装する例をいくつか読んでなるほどなと思ったわけです。この例の場合だと、FApplyが公開されていれば、f1f2 は公開しなくてもよく、内部実装については秘匿してよい。struct だと必須のメンバーというものを持たせられないけど、interface であれば少なくとも意識して実装しないといけないので便利だ。