DRYな備忘録

Don't Repeat Yourself.

Go言語におけるinterfaceのimplementsチェック【golang】

問題

  • Go言語ではinterfaceで実装すべきメソッドの制約がつけれる
  • 定義したstructが定義したinterfaceの実装を満たしているかチェックしたい

解決

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)の挙動がまだよくわかんない