Utilisation idiomatique des générateurs dans Golang
En Python et dans d'autres langages, les générateurs offrent un moyen élégant d'implémenter des fonctions récursives. Cependant, dans Golang, les générateurs doivent être simulés à l'aide de canaux et de goroutines. Cet article explore l'approche idiomatique pour implémenter des générateurs dans Go.
1. Implémentation idiomatique
De manière idiomatique, la fonction de bibliothèque qui simule le générateur doit renvoyer un canal de réception uniquement (<-chan). La fonction de bibliothèque doit être chargée de fermer le canal une fois que le générateur a terminé l'itération. Cela garantit un nettoyage approprié des ressources.
Voici un exemple d'implémentation idiomatique :
func permutateWithChannel(strings []string) chan []string { channel := make(chan []string) go permutateWithChannelHelper(channel, strings, make([]string, 0)) return channel } func permutateWithChannelHelper(channel chan []string, strings []string, prefix []string) { defer close(channel) length := len(strings) if length == 0 { channel <- prefix return } newStrings := make([]string, 0, length-1) for i, s := range strings { newStrings = append(newStrings, strings[:i]...) newStrings = append(newStrings, strings[i+1:]...) newPrefix := append(prefix, s) permutateWithChannelHelper(channel, newStrings, newPrefix) } }
2. Responsabilité de la fermeture de la chaîne
Idiomalement, la fonction bibliothèque devrait être responsable de la fermeture de la chaîne. Cela garantit que les ressources sont correctement nettoyées même si l'appelant ne ferme pas explicitement le canal.
3. Modification de l'exemple
La modification suggérée du code n'est pas idiomatique car elle nécessite que l'appelant gère la fermeture du canal. L'appelant ne devrait pas être responsable de la fermeture du canal créé par la fonction de bibliothèque.
4. Conséquence de la fermeture d'un canal fermé
Une fois que l'appelant a fermé le canal, la goroutine exécutant le code de la bibliothèque peut paniquer lorsqu'elle tente d'envoyer vers le canal fermé. Cette panique peut provoquer l'arrêt de la goroutine, mais elle ne provoquera aucun effet secondaire négatif observable.
5. Renvoi d'un canal de réception uniquement
La fonction de bibliothèque peut renvoyer un canal de réception uniquement même si elle est responsable de la fermeture du canal. Cela se fait en utilisant un canal tamponné avec une taille de tampon de 1. Le canal tamponné garantit que l'appelant ne peut pas fermer le canal.
Voici un exemple :
func PermutateWithChannel(strings []string) <-chan []string { channel := make(chan []string, 1) go permutateWithChannel(channel, strings, make([]string, 0)) return channel }
Conclusion
Comprendre l'approche idiomatique de la mise en œuvre des générateurs dans Go garantit une bonne gestion des ressources et évite les problèmes potentiels avec les canaux fermés. Les développeurs doivent utiliser les techniques recommandées pour garantir un code efficace et fiable.
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!