Camlistore の例
camlistore は、コンパイル時の型を確認するために次のコード スニペットを使用します。 check:
<code class="go">var ( _ blobref.StreamingFetcher = (*CachingFetcher)(nil) _ blobref.SeekFetcher = (*CachingFetcher)(nil) _ blobref.StreamingFetcher = (*DiskCache)(nil) _ blobref.SeekFetcher = (*DiskCache)(nil) )</code>
この構文により、コンパイラーは、変数に割り当てられた型が実際に必要なインターフェイスを実装していることを検証できます。ただし、変数宣言でのポインタの使用はわかりにくいように思えるかもしれません。
型付き Nil 値と変換構文
構文 (*T)(nil) は型付きを表します。ゼロ値。これは、変数が *T 型の nil 値を保持することを意味します。このコンテキストでは、インターフェイスが具象変数ではなく、それぞれの具象型の nil ポインターに割り当てられることを主張します。
Go の変換構文は T(expr); です。ただし、ポインターを扱う場合、質問で述べた優先順位の問題が発生します。これを解決するために、代替構文が提供されています。
<code class="go">(T)(expr)</code>
したがって、(*T)(expr) は、上記の代替構文を使用して関数 T(expr) の結果を逆参照する式を表します。
インターフェイス コンプライアンスの強制
camlistore の例では、コンパイラは、CachingFetcher が StreamingFetcher と SeekFetcher のパブリック関数を実装していることをチェックし、同様に DiskCache についてもチェックします。このアプローチにより、型が期待されるプロトコルを確実に満たし、実行時エラーにつながる可能性のある不一致が防止されます。
以上がCamlistore はどのように `(*T)(nil)` を使用してコンパイル時インターフェイスのコンプライアンスを強制しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。