ホームページ >バックエンド開発 >Golang >構造体の Go スライスをインターフェイス スライスに割り当てるにはどうすればよいですか?

構造体の Go スライスをインターフェイス スライスに割り当てるにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-01 06:59:10228ブラウズ

How Can I Assign a Go Slice of Structs to an Interface Slice?

Go のインターフェイス スライスと構造体配列

Go では、構造体のスライス ([]MyStruct) をインターフェイス スライス ([ ]インターフェイス{})を直接使用することはできません。これは、構造体とインターフェイスが異なるメモリ表現を使用するためです。

構造体のフィールドはメモリ内で連続しているのに対し、インターフェイスは型情報とデータのペアとして格納されます。この違いにより、この 2 つの間の直接変換が妨げられます。

直接代入が失敗する理由

x (構造体のスライス) を y (インターフェイス) に代入しようとしたときのコンパイラ エラースライス)は、この根本的な違いを反映しています。 Go では代入に型の互換性が必要ですが、2 つの型は一致しません。

汎用オブジェクト配列を処理するための代替手段

構造体配列をインターフェイス スライスに直接割り当てることができないにもかかわらず, Goは、汎用オブジェクトを処理するための代替アプローチをいくつか提供しています。配列:

  1. 要素を個別にコピー: 構造体配列の要素は、ループを使用してインターフェイス スライスに手動でコピーできます。
  2. インターフェイス スライス: 各インターフェイスが個別の構造体を保持するインターフェイスのスライスを作成できます。 object.
  3. インターフェイス ラッパー: インターフェイス ラッパーは、構造体配列型を表すように定義し、インターフェイス値として保存できます。

サンプル コード

// Copy Elements Individually
var x []MyStruct = [...]MyStruct{{5}, {6}}
var y []interface{}
for _, v := range x {
    y = append(y, v)
}

// Interface Slices
var x []MyStruct = [...]MyStruct{{5}, {6}}
var y []interface{} = make([]interface{}, len(x))
for i, v := range x {
    y[i] = v
}

// Interface Wrapper
type MyStructArrayWrapper interface {
    Get() []MyStruct
}
type MyStructArrayWrapperImpl struct {
    array []MyStruct
}

func (w *MyStructArrayWrapperImpl) Get() []MyStruct {
    return w.array
}
x := []MyStruct{MyStruct{5}, MyStruct{6}}
var y interface{} = &MyStructArrayWrapperImpl{x}

以上が構造体の Go スライスをインターフェイス スライスに割り当てるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。