Go ではインターフェイスはどのように実装されていますか?
Go でインターフェイスを調べる場合、異なる視点から一見反対の理解が得られることがあります。
スキーム表現
「反射の法則」の記事では、インターフェイス値には (値, 型) のペアが含まれています。たとえば、io.Reader を変数 r に代入すると、r = (tty, *os.File) となります。ここで、tty は値であり、*os.File は基礎となる値のタイプを表します。 Read メソッドへのインターフェイス制限にもかかわらず、内部値は完全な型情報を保持します。
Dynamic Dispatch
逆に、別の記事では、型の itable が実装されていると述べています。特定のインターフェースメソッド。 Stringer を実装する Binary 型の場合、その itable には String メソッドのみが含まれます。これは、基になる値の型ではなく、itable がインターフェイス値の静的型を反映する必要があることを意味します。
明確化
これら 2 つの観点は相互に補完します。 「反射の法則」は、反射を通して見られるインターフェース値を調べ、簡略化された表現を提供します。 2 番目の記事では、インターフェイスの基礎となる動的ディスパッチ メカニズムに焦点を当て、特定の実装メソッドの関与を明らかにします。
変数 r には実際に値として tty が含まれており、ラッパー インターフェイスである静的型 io.Reader を持ちます。 Read メソッドへのアクセスを提供します。ただし、基になる値 tty は、Read 以外の追加メソッドを含め、その型を *os.File として保持します。
Go では、インターフェイスは動的ディスパッチを通じて実装され、ランタイムは具体的なメソッドに基づいてどのメソッド実装を呼び出すかを解決します。ラップされた値の型。 itable には、各インターフェイス メソッドの実装の詳細が保存されます。
以上が## Go でインターフェイスはどのように実装されますか: 静的型または動的ディスパッチ?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。