Goコンパイラは、型が指定されたインターフェイスを実装しているかどうかを確認します

オープンソースライブラリには、次のような奇妙な構文があります。

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

おすすめ

転載: blog.csdn.net/QiuHaoqian/article/details/107860984
おすすめ