Maison  >  Article  >  développement back-end  >  Comment décompresser une tranche de tranches en une fonction variadique dans Go ?

Comment décompresser une tranche de tranches en une fonction variadique dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 12:14:31515parcourir

How to Unpack a Slice of Slices into a Variadic Function in Go?

Fonction variadique et tranche de tranches décompressée

Lorsque vous travaillez avec une fonction variadique qui accepte plusieurs arguments, la gestion d'une tranche de tranches peut présenter un défi. Voici un cas spécifique où le déballage d'une tranche de tranches peut provoquer une erreur du compilateur :

Considérez la fonction variadique suivante :

<code class="go">func unpack(args ...interface{})</code>

Si nous avons une tranche d'interfaces, nous pouvons la transmettre directement à la fonction sans aucun problème :

<code class="go">slice := []interface{}{1, 2, 3}
unpack(slice) // works
unpack(slice...) // also works</code>

Cependant, si nous avons une tranche de tranches d'interfaces, tenter de transmettre une version décompressée entraîne une erreur de compilation :

<code class="go">sliceOfSlices := [][]interface{}{
    []interface{}{1, 2},
    []interface{}{101, 102},
}
unpack(sliceOfSlices) // works
unpack(sliceOfSlices...) // compiler error</code>

Le Le message d'erreur est :

cannot use sliceOfSlices (type [][]interface {}) as type []interface {} in argument to unpack

Pour comprendre ce comportement, nous devons approfondir la spécification permettant de transmettre des arguments aux paramètres variadiques dans Go :

"Si l'argument final est attribuable à un type de tranche []T, il peut être transmis inchangé comme valeur d'un paramètre ...T si l'argument est suivi de ...."

Dans ce cas, le paramètre variadique est ...interface{}, et une affectation directe de sliceOfSlices (qui est de type [][]interface{}) à args (de type []interface{}) n'est pas valide.

Donc, comment pouvons-nous envoyer le contenu décompressé de sliceOfSlices à unpack() ? La solution consiste à créer une nouvelle tranche de type []interface{}, à copier les éléments, puis à la transmettre en utilisant ....

<code class="go">var sliceOfSlices2 []interface{}
for _, v := range sliceOfSlices {
    sliceOfSlices2 = append(sliceOfSlices2, v)
}

unpack(sliceOfSlices2...)</code>

Cette méthode garantit que chaque tranche interne est représentée comme un élément en une seule tranche, ce qui le rend compatible avec le paramètre variadique ...interface{}.

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