Go ではインターフェイスはどのように表現されますか?
Go でのインターフェイスの表現についてはさまざまなリソースで説明されていますが、矛盾しているように見えるものもあります。この記事は、このような 2 つのリソース間の粒度の違いを強調することで混乱を明確にすることを目的としています。
違いを理解する
「反映の法則」というタイトルの記事では、リフレクションを使用してオブジェクトを検査する方法の低レベルの詳細。インターフェイス値には (値、型) のペアが含まれることが説明されています。たとえば、次のコードの変数 r は、(tty, *os.File) のペアを持つものとして記述されています。
<code class="go">var r io.Reader tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0) if err != nil { return nil, err } r = tty</code>
一方、2 番目の記事では、インターフェイスの動的ディスパッチ プロパティを調べます。これは、ランタイムがインターフェイスの実装に関連付けられた「itable」に基づいてインターフェイス メソッドを解決することを説明しています。たとえば、Binary 型を保持する Stringer インターフェイスの図では、このテーブルにはインターフェイス (String) を満たすために使用されるメソッドがリストされていますが、Binary 型によって実装される追加のメソッドはリストされていません。
違い
これら 2 つのリソースは、同じ概念を異なる抽象化レベルで説明しています。 1 つ目ではリフレクションの実装について説明し、2 つ目では実行時の動作に焦点を当てます。
実行時、インターフェイスは、動的ディスパッチを容易にするためにラップされたオブジェクトに関する情報を提供する「ラッパー オブジェクト」として機能します。これは、最初の例で r で Read を呼び出すことが機能する理由を説明しています。これは itable を使用して *os.File 型の Read 関数実装を見つけます。
要約すると、インターフェースは、次の機能を提供するランタイム「ラッパー オブジェクト」として理解できます。動的ディスパッチに関する情報。リフレクションは、これを (値, 型) ペアとして高レベルで表現します。
以上がGo でインターフェイスはどのように機能するか: リフレクションとランタイムの動作?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。