Go 言語でダックタイピング

言語仕様を少し読んで書いてみた。

[ソース]

package main

import(
    "fmt"
)

type Accessor interface{
    GetText() string
}

func Say(acsr Accessor){
  fmt.Println(acsr.GetText())
}


type Inu struct{
    name string
}

func (self *Inu) GetText() string{
    return self.name + "だわん"
}

type Neko struct{
    name string
}

func (self *Neko) GetText() string{
    return self.name + "だにゃー"
}

type Momonga struct{
    name string
}

func (self *Momonga) GetText() string{
    return self.name + "momonga"
}


func main(){
    inu := Inu{"ポチ"}
    Say(&inu)

    neko := Neko{"タマ"}
    Say(&neko)

    momonga := Momonga{"super"}
    Say(&momonga)
}

[出力]

ポチだわん
タマだにゃー
supermomonga


Go には継承やジェネリックがなく、代わりに interface というものが存在するらしい。
多態性を行いたい場合はその interface を利用して書く事ができるみたい。
で、Go は初めて書いたんだけども(良し悪しは別として)結構癖があって書きづらい印象ですね。
今のところ特に書く必要性はないのだけれどガッツリと書く場合は慣れるまでに時間がかかりそう。
こういう感覚は Haskell のコードを書いてみた時にも時にも感じたなぁ。
しかし、interface の書き方を見ていると今はなき C++11 の Concept を思い出す。