プログラミング言語Goを読んでいて、型アサーションの説明が分かりづらかったのでメモ
型アサーション
型アサーションはインタフェースの値に使えるインタフェース型の変換のようなものである
io.Writerインタフェース型の値があるとする
var w io.Writer
w = os.Stdout
fmt.Printf("type = %T\n", w) // type = *os.File
この時、wが別のインタフェース型になれるか調べることができる
rw := w.(io.ReadWriter) // 成功する
(*os.File)型はReadおよびWriteのメソッドを持っているため成功する。
rwでは、ReadWriterで定義されているメソッドReadも追加で呼ぶことができる
失敗した場合はpanicが発生するが、成功したかという変数を受け取ればpanicは発生しない
var w io.Writer
w = new(ByteCounter) // ByteCounterは、ReadメソッドがないためReadWriterインタフェースは満たせない
rw := w.(io.ReadWriter) // panicが発生する
rw, ok = w.(io.ReadWriter) // rwにはゼロ値、okにはfalseが入る