Puis-je laisser un canal Go ouvert pour toujours (ne jamais fermer le canal) si je ne vérifie jamais son état? Cela conduira-t-il à des fuites de mémoire? Le code suivant est-il OK?
func (requestCh chan<- Request) GetResponse(data RequestData) Response {
reply := make(chan Response)
requestCh <- Request{data: data, replyCh: reply}
return <-reply
}
gc
et l'auteur de cesgccgo
chaînesclose
ne sont pas nécessaires, sauf si vous recherchez un fichierclose
. Ce sont des conseils faisant autorité.Oui, vous pouvez garder une chaîne ouverte. Comme l' indique le livre du langage de programmation go :
la source
Oui, il est normal 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 ramassé.
la source
" Un principe général d'utilisation des canaux Go est de ne pas fermer un canal du côté du récepteur et de ne pas fermer un canal si le canal a plusieurs expéditeurs simultanés. "
Comme clairement mentionné dans la réponse ci-dessus, chaque canal sera finalement GCed une fois qu'il sera marqué pour le nettoyage, il est donc normal de laisser le canal non fermé, la seule différence que cela fera est que ce canal sera disponible
gc
après quelques cycles, peut-être si pas fermé explicitement.Également les articles suivants ceci et cela montrent différentes façons de fermer un canal dans le cas de 1: N, N: 1 ou M: N (expéditeurs: récepteurs)
la source
Go est ramassé, vous n'avez donc pas vraiment besoin de «libérer» quoi que ce soit.
Il est possible de fermer les canaux, mais il est principalement utilisé pour - fermer (canal) - dire au goroutine (ou au programme principal) que rien d'autre ne sera envoyé sur ce canal.
la source