Go言語におけるinterfaceのimplementsチェック【golang】
問題
- Go言語では
interface
で実装すべきメソッドの制約がつけれる - 定義した
struct
が定義したinterface
の実装を満たしているかチェックしたい
解決
- Go言語では "Type Assertion" という仕組みがある
package main import "fmt" // import "reflect" type Foo interface { Echo() string } type Bar interface { Unko() string } type Fooer struct { } func (f Fooer)Echo() string { return "implements Echo" } func main() { f := Fooer{} fooer, ok := interface{}(f).(Foo) fmt.Printf("%T\n", fooer) fmt.Printf("%T\n", ok) fmt.Println(fooer, ok) barer, ng := interface{}(f).(Bar) fmt.Printf("%T\n", barer) fmt.Printf("%T\n", ng) fmt.Println(barer, ng) } // main.Fooer // bool // {} true // <nil> // bool // <nil> false
http://play.golang.org/p/nHUkG3DLxg
雑感
- 地味に1時間くらい探した
- hoge.(Fuga)はcastというかType Assertionなのは理解したけれど、
interface{}(hoge)
の挙動がまだよくわかんない