Maison >développement back-end >Golang >Comment décompresser une tranche de tranches pour des fonctions variadiques dans Go ?
Déballage d'une tranche de tranches pour des fonctions variadiques
En Go, lorsqu'il s'agit d'une tranche de tranches et de fonctions variadiques, il faut faire attention lors du passage des tranches en tant qu'arguments décompressés. Contrairement aux tranches d'interfaces, les tranches de tranches ne peuvent pas être directement transmises comme arguments décompressés aux fonctions variadiques qui attendent une tranche d'interfaces.
Comprendre le problème
La cause première de le problème réside dans le système de types de Go. Le dernier paramètre d'une fonction variadique est considéré comme une tranche du type spécifié. Cependant, lors du passage d'une tranche de tranches, le compilateur attend une tranche du type d'élément de base, et non une tranche de tranches. Par conséquent, l'erreur d'incompatibilité de type se produit lorsque vous tentez de décompresser directement des tranches de tranches.
Résoudre le problème
Pour résoudre le problème, une étape intermédiaire est requise : créer un nouvelle tranche du type d'élément de base et en y copiant les éléments de la tranche de tranches. Cette nouvelle tranche peut ensuite être transmise comme arguments décompressés à la fonction variadique.
<code class="go">var sliceOfSlices [][]interface{} // Create a new slice to hold the unpacked elements var newSlice []interface{} for _, slice := range sliceOfSlices { newSlice = append(newSlice, slice...) } unpack(newSlice...) // Now it works</code>
Comprendre le comportement
Lorsque vous transmettez une tranche non compressée à une fonction variadique, chaque élément de la tranche est passé comme argument distinct. Ce n'est pas le cas lorsque vous transmettez la tranche elle-même, car elle est enveloppée dans une valeur d'interface{} et transmise comme un seul argument.
Pour démontrer cela, considérez l'extrait de code suivant :
<code class="go">func unpack(args ...interface{}) { fmt.Println("Number of arguments:", len(args)) } slice := []interface{}{1, 2, 3} unpack(slice) // Prints: 1 unpack(slice...) // Prints: 3</code>
Le résultat montre que le passage direct de la tranche (sans décompression) donne un seul argument, tandis que la décompression donne trois arguments distincts.
Conclusion
Déballage une tranche de tranches pour fonctions variadiques nécessite une étape intermédiaire de copie des éléments de tranche dans une nouvelle tranche du type d'élément de base. Cela évite l'erreur d'incompatibilité de type et permet aux éléments d'être transmis en tant qu'arguments distincts à la fonction.
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!