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

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

Susan Sarandon
Susan Sarandonoriginal
2024-11-30 19:19:15246parcourir

How Can I Assign a Slice of Structs to a Slice of Interfaces in Go?

Attribution d'une tranche de structures à une tranche d'interface

Lorsque vous tentez d'attribuer une tranche de structures ([]MyStruct) à une tranche d'interfaces ( []interface{}), vous pouvez rencontrer une erreur de compilation. En effet, les structures et les interfaces ont des représentations en mémoire différentes.

Les champs des structures sont stockés adjacents en mémoire, tandis que les interfaces sont stockées sous la forme d'une paire de deux mots, un pour les informations de type et un pour les données réelles. Cette différence empêche l'affectation directe.

Solutions possibles :

  • Copier les éléments individuellement : Vous pouvez parcourir manuellement la tranche de structure et copier chaque élément dans l'interface slice.
y := make([]interface{}, len(x))
for i, v := range x {
    y[i] = v
}
  • Utiliser le wrapper d'interface : Vous pouvez créer un type de wrapper qui implémente l'interface interface{} et contient la structure sous-jacente.
type IMyStruct struct {
    MyStruct
}

func (i IMyStruct) Interface() interface{} {
    return i.MyStruct
}

x := []MyStruct{{5}, {6}}
y := []interface{}{IMyStruct{x[0]}, IMyStruct{x[1]}}
  • Utiliser une interface vide : Vous pouvez attribuer la tranche de structures à une interface vide, qui peut contenir des valeurs de tout type.
var y interface{}
y = x // No type conversion required

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