web-dev-qa-db-fra.com

Peut-on laisser une chaîne ouverte?

Puis-je laisser un canal Go ouvert pour toujours (ne jamais fermer le canal) si je ne vérifie jamais son état? Cela entraînera-t-il des fuites de mémoire? Le code suivant est-il correct?

func (requestCh chan<- Request) GetResponse(data RequestData) Response {
    reply := make(chan Response)
    requestCh <- Request{data: data, replyCh: reply}
    return <-reply
}
128
Kluyg

Vous pouvez laisser une chaîne Go ouverte pour toujours et ne jamais la fermer. Lorsque le canal n'est plus utilisé, il sera récupéré.

Notez qu'il n'est nécessaire de fermer un canal que si le récepteur recherche une fermeture. La fermeture du canal est un signal de contrôle sur le canal indiquant qu'aucune donnée supplémentaire ne suit.

Question de conception: fermeture de chaîne

186
peterSO

Oui, il est permis de garder un canal ouvert. Comme le langage de programmation go livre a déclaré:

Vous n'avez pas besoin de fermer chaque chaîne lorsque vous en avez terminé. Il est seulement nécessaire de fermer un canal lorsqu'il est important de dire aux goroutines de réception que toutes les données ont été envoyées. Un canal que le garbage collector détermine être inaccessible verra ses ressources récupérées, qu'elle soit fermée ou non. (Ne confondez pas cela avec l'opération de fermeture pour les fichiers ouverts. Il est important d'appeler la méthode Fermer sur chaque fichier lorsque vous en avez terminé.)

23
cizixs

Oui, c'est OK de laisser la chaîne ouverte, et en fait c'est typique. Un canal ouvert ne constitue pas une référence à l'objet canal et ne l'empêche donc pas d'être récupéré.

5
Sonia