Maison > développement back-end > Golang > Comment puis-je attribuer une tranche Go de structures à une tranche d'interface ?

Comment puis-je attribuer une tranche Go de structures à une tranche d'interface ?

Patricia Arquette
Libérer: 2024-12-01 06:59:10
original
228 Les gens l'ont consulté

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

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 :

  1. Copier les éléments Individuellement : Les éléments d'un tableau de structures peuvent être copiés manuellement dans une tranche d'interface à l'aide d'une boucle.
  2. Tranches d'interface : Vous pouvez créer une tranche d'interfaces, où chaque interface contient un objet de structure individuel.
  3. Interface Wrapper : Un wrapper d'interface peut être défini pour représenter le type de tableau de structure et stocké comme valeur d'interface.

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}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal