
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言語でインタフェースの変更がそれ程問題にならない理由 mattn.kaoriya.net
Go言語の型とreflect qiita.com
Go言語入門 vol.4 – Goの型アサーションについて
Go言語入門 vol.4 – Goの型アサーションについて – | オガリア 技術ブログ