ホームページ > バックエンド開発 > Golang > 構造スライス! =それが実装するインターフェーススライス?

構造スライス! =それが実装するインターフェーススライス?

PHPz
リリース: 2024-02-09 13:03:08
転載
445 人が閲覧しました

構造スライス! =それが実装するインターフェーススライス?

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート