Go の io パッケージのソース コードを読んでいるときに、よくわからないスニペットを見つけました。ここにあります
func WriteString(w Writer, s string) (n int, err error) {
if sw, ok := w.(stringWriter); ok {
return sw.WriteString(s)
}
return w.Write([]byte(s))
}
どこ
type stringWriter interface {
WriteString(s string) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
型アサーションw.(stringWriter)
は、w の動的型 (つまり Writer) が stringWriter インターフェースを実装することを表明します。stringWriter と Writer の型定義を考えると、これがどのように可能かわかりません。このコードが正しいと仮定すると、何が欠けているのでしょうか?