Maison >développement back-end >Golang >Comment la responsabilité de la fermeture des canaux dans les générateurs Go doit-elle être gérée ?
Dans Go, l'implémentation de générateurs utilisant le rendement est généralement réalisée grâce à une combinaison de goroutines et de canaux. La fonction génératrice crée une goroutine qui génère des valeurs via un canal, et la fonction consommateur reçoit ces valeurs du canal dans une boucle for-range.
Selon le Allez les idiomes, la responsabilité de la fermeture du canal incombe à la fonction générateur. Étant donné que le générateur sait quand l'itération est terminée, il doit fermer le canal pour signaler au consommateur qu'aucune autre valeur ne sera reçue.
Dans votre code modifié, vous avez correctement placé la responsabilité de la fermeture du canal sur l'appelant en ne le fermant pas dans la fonction générateur. Cependant, vous devez également supprimer l'appel close() dans la fonction main(), car il est incorrect de fermer un canal déjà fermé.
package main import ( "./lib" "fmt" ) var ( fruits = []string{"apple", "banana", "cherry", "durian"} banned = "durian" ) func main() { channel := lib.PermutateWithChannel(fruits) defer close(channel) // Defer closing the channel for myFruits := range channel { fmt.Println(myFruits) if myFruits[0] == banned { break // Break from the loop instead of closing the channel } } }
type ReceiveOnlyChannel <-chan []string func NewReceiveOnlyChannel(channel <-chan []string) *ReceiveOnlyChannel { return (*ReceiveOnlyChannel)(&channel) } func PermutateWithChannel(strings []string) *ReceiveOnlyChannel { // ... (same as before, except it returns ReceiveOnlyChannel) }
Pour restreindre le canal renvoyé par la fonction de bibliothèque pour recevoir -seulement, tout en permettant à l'appelant de le fermer, vous pouvez introduire un nouveau type qui enveloppe le canal et expose uniquement le canal de réception uniquement. canal :
En encapsulant le canal dans un nouveau type, vous pouvez restreindre son accessibilité pour recevoir uniquement des opérations tout en permettant à l'appelant de le fermer via la méthode Close() du type wrapper.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!