オープンソースライブラリには、次のような奇妙な構文があります。
var _ io.Writer = (*myWriter)(nil)
var _ io.Writer = myWriter{
}
現時点では少し混乱しますが、これは実際には* myWriter型がio.Writerインターフェイスを実装しているかどうかをチェックするコンパイラです。
例を見てみましょう:
package main
import "io"
type myWriter struct {
}
/*func (w myWriter) Write(p []byte) (n int, err error) {
return
}*/
func main() {
// 检查 *myWriter 类型是否实现了 io.Writer 接口
var _ io.Writer = (*myWriter)(nil)
// 检查 myWriter 类型是否实现了 io.Writer 接口
var _ io.Writer = myWriter{
}
}
myWriter用に定義された書き込み関数をコメントアウトした後、プログラムを実行します。
src/main.go:14:6: cannot use (*myWriter)(nil) (type *myWriter) as type io.Writer in assignment:
*myWriter does not implement io.Writer (missing Write method)
src/main.go:15:6: cannot use myWriter literal (type myWriter) as type io.Writer in assignment:
myWriter does not implement io.Writer (missing Write method)
エラーメッセージ:* myWriter / myWriterはio.Writerインターフェイスを実装していません。つまり、Writeメソッドは実装されていません。
コメントを外した後、プログラムの実行時にエラーは報告されません。
実際、上記の代入ステートメントは暗黙的な型変換を行います。変換プロセス中に、コンパイラは、等号の右側の型が、等号の左側のインターフェイスで指定された関数を実装しているかどうかを確認します。
Go言語の文法とGo言語の一般的な知識のポイントについて詳しく知りたい場合は、私のメモのソースコードを参照してくださいhttps://github.com/qiuyunzhao/go_basis