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!