Apakah boleh meninggalkan saluran Go selamanya (tidak pernah menutup saluran) jika saya tidak pernah memeriksa kondisinya? Apakah ini akan menyebabkan kebocoran memori? Apakah kode berikut OK?
func (requestCh chan<- Request) GetResponse(data RequestData) Response {
reply := make(chan Response)
requestCh <- Request{data: data, replyCh: reply}
return <-reply
}
gc
dan penulisgccgo
say channelclose
s tidak diperlukan, kecuali jika Anda mencari aclose
. Itu saran resmi.Ya, tidak apa-apa untuk menjaga saluran tetap terbuka. Seperti yang dinyatakan buku bahasa pemrograman go :
sumber
Ya, tidak apa-apa untuk membiarkan saluran tetap terbuka, dan sebenarnya itu tipikal. Saluran yang terbuka bukan merupakan referensi ke objek saluran, dan karenanya tidak mencegahnya dari pengumpulan sampah.
sumber
" Salah satu prinsip umum menggunakan saluran Go adalah jangan tutup saluran dari sisi penerima dan jangan tutup saluran jika saluran memiliki beberapa pengirim bersamaan. "
Seperti disebutkan dengan jelas dalam jawaban di atas bahwa setiap saluran akan menjadi GCed pada akhirnya setelah ditandai untuk pembersihan, jadi tidak apa-apa untuk membiarkan saluran tidak ditutup, satu-satunya perbedaan yang akan terjadi adalah bahwa saluran tersebut akan tersedia untuk
gc
setelah beberapa siklus mungkin jika tidak ditutup secara eksplisit.Juga artikel berikut ini dan ini menunjukkan berbagai cara untuk menutup saluran jika 1: N, N: 1 atau M: N (pengirim: penerima)
sumber
Go adalah sampah yang dikumpulkan, jadi Anda tidak perlu 'membebaskan' apa pun.
Ada kemungkinan untuk menutup saluran, tetapi sebagian besar digunakan sebagai - tutup (saluran) - beri tahu goroutine (atau program utama) bahwa tidak ada lagi yang akan dikirim pada saluran itu.
sumber