Go のインターフェイス スライスと構造体配列
Go では、構造体のスライス ([]MyStruct) をインターフェイス スライス ([ ]インターフェイス{})を直接使用することはできません。これは、構造体とインターフェイスが異なるメモリ表現を使用するためです。
構造体のフィールドはメモリ内で連続しているのに対し、インターフェイスは型情報とデータのペアとして格納されます。この違いにより、この 2 つの間の直接変換が妨げられます。
直接代入が失敗する理由
x (構造体のスライス) を y (インターフェイス) に代入しようとしたときのコンパイラ エラースライス)は、この根本的な違いを反映しています。 Go では代入に型の互換性が必要ですが、2 つの型は一致しません。
汎用オブジェクト配列を処理するための代替手段
構造体配列をインターフェイス スライスに直接割り当てることができないにもかかわらず, Goは、汎用オブジェクトを処理するための代替アプローチをいくつか提供しています。配列:
サンプル コード
// 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 サイトの他の関連記事を参照してください。