Tranches d'interface et tableaux de structures dans Go
Dans Go, attribuer une tranche de structures ([]MyStruct) à une tranche d'interface ([ ]interface{}) n'est pas directement possible. En effet, les structures et les interfaces utilisent des représentations de mémoire différentes.
Les champs de structure sont contigus en mémoire, tandis que les interfaces sont stockées sous forme d'informations de type et de paires de données. Cette différence empêche la conversion directe entre les deux.
Pourquoi l'affectation directe échoue
L'erreur du compilateur lors de la tentative d'affectation de x (une tranche de structures) à y (une interface slice) reflète cette différence sous-jacente. Go nécessite une compatibilité de type pour les affectations, et les deux types ne correspondent pas.
Alternatives pour gérer les tableaux d'objets génériques
Malgré l'impossibilité d'attribuer directement des tableaux de structures aux tranches d'interface , Go propose plusieurs approches alternatives pour gérer les tableaux d'objets génériques :
Exemple de code
// 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}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!