Le code fourni démontre une fonction de générateur récursif utilisant des canaux pour simuler le rendement de style Python.
Idiomatiquement, les générateurs dans Go peuvent être implémentés à l'aide de goroutines et de canaux comme suit :
Idiomatiquement, la fonction générateur devrait être responsable de la fermeture du canal. Cela garantit que le canal est fermé lorsque le générateur a fini d'envoyer toutes les valeurs.
Le code modifié peut être écrit idiomatiquement comme suit :
Bibliothèque
func permutateWithChannel(channel chan<- []string, strings, 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 { newStringsI := append(newStrings, strings[:i]...) newStringsI = append(newStringsI, strings[i+1:]...) newPrefixI := append(prefix, s) go permutateWithChannel(channel, newStringsI, newPrefixI) } } func PermutateWithChannel(strings []string) chan []string { channel := make(chan []string) prefix := make([]string, 0, len(strings)) go permutateWithChannel(channel, strings, prefix) return channel }
Appelant
func main() { channel := lib.PermutateWithChannel(fruits) for myFruits := range channel { fmt.Println(myFruits) if myFruits[0] == banned { return } } }
Fermer le canal après que le consommateur l'a fermé ne provoquera pas de panique. En fait, essayer d'envoyer une valeur à un canal fermé entraînera une erreur de canal fermé.
Pour restreindre la fonction de bibliothèque à la réception uniquement, l'approche idiomatique consiste à utiliser un type de canal distinct pour recevoir des valeurs et envoyer des signaux. Dans ce cas, la fonction bibliothèque aurait la signature suivante :
func PermutateWithChannel(strings []string) (<-chan []string, chan<- struct{})
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!