Heim >Backend-Entwicklung >Golang >Wie implementiert man rekursive Generatoren in Go mithilfe von Kanälen idiomatisch?
Der bereitgestellte Code demonstriert eine rekursive Generatorfunktion, die Kanäle verwendet, um einen Ertrag im Python-Stil zu simulieren.
Idiomatisch können Generatoren in Go mithilfe von Goroutinen und Kanälen implementiert werden wie folgt:
Idiomatisch sollte die Generatorfunktion für das Schließen des Kanals verantwortlich sein. Dadurch wird sichergestellt, dass der Kanal geschlossen wird, wenn der Generator alle Werte gesendet hat.
Der modifizierte Code kann idiomatisch geschrieben werden als folgt:
Bibliothek
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 }
Anrufer
func main() { channel := lib.PermutateWithChannel(fruits) for myFruits := range channel { fmt.Println(myFruits) if myFruits[0] == banned { return } } }
Das Schließen des Kanals, nachdem der Verbraucher ihn geschlossen hat, führt nicht zu einer Panik. Tatsächlich führt der Versuch, einen Wert an einen geschlossenen Kanal zu senden, zu einem Fehler beim geschlossenen Kanal.
Um die Bibliotheksfunktion auf nur Empfangen zu beschränken, ist der idiomatische Ansatz besteht darin, einen separaten Kanaltyp für den Empfang von Werten und das Senden von Signalen zu verwenden. In diesem Fall hätte die Bibliotheksfunktion die folgende Signatur:
func PermutateWithChannel(strings []string) (<-chan []string, chan<- struct{})
Das obige ist der detaillierte Inhalt vonWie implementiert man rekursive Generatoren in Go mithilfe von Kanälen idiomatisch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!