php エディタ Apple は、構造スライスに関するパズルを明らかにするためにここにいます。構造スライスと、それが実装するインターフェイス スライスの違いは何ですか? Go 言語では、スライスはサイズを動的に変更できる便利で柔軟なデータ構造です。構造体スライスは特殊な形式のスライスで、構造体タイプの要素を格納します。しかし、同じインターフェイスを実装するスライスとどう違うのでしょうか?一緒に答えを見つけてみましょう。
インターフェイス Model
があり、構造体 person
によって実装されています。
モデル インスタンスを取得するために、次のヘルパー関数があります:
リーリー上記のメソッドにより、正しいタイプの Person インスタンスを返すことができます (同じメソッドを使用して、後で新しいモデルを簡単に追加できます)。
モデル スライスを返すためにこのようなことを実行しようとすると、エラーが発生します。コード:
リーリーGo は次のように不満を述べています: newpersons() (タイプ []パーソン) をタイプ []Model の戻りパラメータとして使用できません
私の目標は、リクエストされたあらゆるモデル タイプのスライスを返すことです ([]Person
、[]FutureModel
、[]Terminator2000
、w/ e)。何が欠けているのでしょうか?そのようなソリューションを適切に実装するにはどうすればよいですか?
これは、先ほど答えた質問と非常によく似ています: //m.sbmmt.com/link/2c029952e202c0e560626a4c5980d64c
簡単に言えば、あなたの言う通りです。構造体のスライスは、構造体によって実装されるインターフェイスのスライスと等しくありません。
[]person
と []Model
のメモリ レイアウトは異なります。これは、それらが属する型のメモリ レイアウトが異なるためです。 Model
はインターフェイス値であり、メモリ内で 2 ワードのサイズであることを意味します。 1 つのワードはタイプ情報を表し、もう 1 つのワードはデータを表します。 Person
は、含まれるフィールドによってサイズが異なる構造体です。 []Person
から []Model
に変換するには、配列をループして各要素を型キャストする必要があります。
この変換は O(n) 操作であり、新しいスライスが作成されるため、Go はこの操作を暗黙的に実行することを拒否します。次のコードを使用して、これを明示的に行うことができます。
リーリーdskinner が指摘したように、 必要なのはスライスへのポインタではなく、スライスへのポインタである可能性が高いです。通常、スライスへのポインタは必要ありません。
リーリー以上が構造スライス! =それが実装するインターフェーススライス?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。