Maison >développement back-end >Golang >Comment décompresser une tranche de tranches pour des fonctions variadiques dans Go ?

Comment décompresser une tranche de tranches pour des fonctions variadiques dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-27 00:08:301051parcourir

How to Unpack a Slice of Slices for Variadic Functions in 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!

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