Maison >développement back-end >Golang >Comment puis-je attribuer un tableau Go Struct à un tableau d'interface ?

Comment puis-je attribuer un tableau Go Struct à un tableau d'interface ?

DDD
DDDoriginal
2024-11-30 19:52:16427parcourir

How Can I Assign a Go Struct Array to an Interface Array?

L'énigme de l'affectation des tableaux d'interface dans Go

Dans Go, la tentative d'attribuer un tableau de structures directement à un tableau d'interface, comme indiqué ci-dessous, génère une erreur de compilation :

x := []MyStruct{...}
var y []interface{}
y = x // Error: cannot use x as type []interface {}

Cette erreur provient de la différence fondamentale dans la façon dont les types de structures et les interfaces sont stockés en mémoire. Les interfaces sont stockées sous forme de paires de deux mots, comprenant des informations de type et des données, tandis que les types de structure sont stockés sous forme de champs adjacents en mémoire.

Étant donné que ces représentations ne s'alignent pas, la conversion directe entre les deux n'est pas réalisable. Il est nécessaire de copier les éléments individuellement dans la tranche de destination.

Pour résoudre ce problème, envisagez l'une des options suivantes :

  • Tranche d'interfaces : Utilisez une tranche []interface{}, où chaque élément est une interface représentant la structure tapez :
var y []interface{}
y = make([]interface{}, len(x))
for i, v := range x {
    y[i] = v
}
  • Interface de Struct Slice : Utilisez une variable d'interface{} pour contenir la []MyStruct slice :
var y interface{}
y = x

Dans ce dernier scénario, l'interface contient une référence abstraite à la tranche []MyStruct sous-jacente, permettant une utilisation polymorphe comportement.

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!

Déclaration:
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