エンジニアはこわくない

雑記とかエンジニアっぽい内容を好きなように書く場所

型アサーションを利用して特定のメソッドを実装しているか調べてみよう


スポンサーリンク

f:id:tsujitaku50:20170224131252j:plain

golangのインターフェースについて調べていると、型アサーションという機能があることを知りました。

この型アサーションを利用して

「特定のメソッドを実装しているか調べる」

といったことが可能みたいなのでやってみました。

サンプルソースコードは以下になります。

type Human interface {}

type Man struct {
    name string
    age  int
}

// Stringメソッドを実装しているのでMan構造体はStringerインターフェースとして振る舞うことが可能
func (m *Man) String() string {
    return strconv.Itoa(m.age) + "歳の" + m.name + "といいます。"
}

func main() {

    m := &Man{
        name:"佐々木",
        age:50,
    }

    var h Human = m
    var result interface{}

    // fが"String()"を実装しているか調べる
    // 実装している場合は
    // sは指定したインターフェース型にアサーションされる(この場合ならStringer型)
    // okがtrueになる
    v, ok := h.(fmt.Stringer);
    if ok {
        result = v.String()
    } else {
        // 何か処理を書ける
    }

    fmt.Println(result)
}
  • 実行結果
% go run main.go                                                                                                                                             
50歳の佐々木といいます。

という感じになりました。

まだまだgolang勉強中なので、正直この機能がどういった場面で使えるのか

イマイチ実感できていないのですが知っていればどこかで使えるときがくるかもしれないので

忘れずに頭の片隅にでも置いておきたいです。

おわり!!

参考記事

Go言語チュートリアル(part11) golang.jp

Go言語でインタフェースの変更がそれ程問題にならない理由 mattn.kaoriya.net

Go言語の型とreflect qiita.com

Go言語入門 vol.4 – Goの型アサーションについて
Go言語入門 vol.4 – Goの型アサーションについて – | オガリア 技術ブログ