Go 言語の interface についてのメモ

Published: 2023/4/3


Go におけるインターフェイスは、 duck typing (的なもの)を採用している。 具体的には、特定の実体型があった場合に、それが特定のインターフェイスを実装しているか、つまり、そのインターフェイス変数に代入できるかどうかは、インターフェイスのメソッドたちをその実体型が実装しているかに依存する。 特に interface を指定せずとも、定義メソッドがインターフェイスを満たしてさえいれば、実体型はインターフェイスに代入できる。

実装

まず、実体として、 interface は基本的には、インターフェイス情報と実データ、それぞれへのポインタの構造体として実装される。

インターフェイス情報(itable)は、

  • インターフェイス型自体の型情報
  • 代入されているデータ型の型情報
  • vtable 的なデータ

をフィールドとして持つ。 これは、 IFace<SomeInterface, SomeDataType> のように、特定のインターフェイスと、そのインターフェイスを満たす特定のデータ型を表すデータ構造。 つまり、 Go 言語は各インターフェイスとそこへの実体型の代入に対して、それを表す、 instantiation データとでも呼ぶべきものを用意する。

instantiation データは、上記の記事によれば、コンパイラがそれを察知できれば、事前にオブジェクトとして静的領域にそれを書き出し、実際の代入の際にはそこへのポインタを interface 構造体の itable へ代入する。

またおそらく、動的にキャストされるなどして事前に静的に生成されていなければ、グローバルな置き場に一度だけ生成しているのだと考えられる。

まとめ

Go 言語は、インターフェイスへの個別データ型の代入ごとにその interface 実体化データというべきデータ構造を生成し、インターフェイスデータは、その実体化データと実データ2つへのポインタとして実装される。


Tags: go

関連記事