close là tín hiệu "không còn dữ liệu nào nữa", không phải thao tác giải phóng bộ nhớ (channel do GC thu hồi).
Sau khi đóng:
- Nhận: trả về ngay lập tức, không chặn. Dữ liệu còn trong buffer được trả ra trước, hết buffer thì trả zero value vô hạn lần.
- Comma-ok phân biệt được hai trường hợp: v, ok := <-ch — ok == false nghĩa là channel đã đóng và cạn dữ liệu.
- for range ch tự kết thúc khi channel đóng. Nếu không ai đóng, vòng lặp treo mãi.
- Gửi vào channel đã đóng: panic: send on closed channel.
- Đóng lại lần nữa hoặc đóng channel nil: cũng panic.
ch := make(chan int, 2)
ch <- 1
close(ch)
v, ok := <-ch // 1, true
v, ok = <-ch // 0, false (drained + closed)Quy ước: chỉ bên gửi được đóng channel, và nếu có nhiều bên gửi thì không ai được tự đóng — dùng một sync.WaitGroup chờ tất cả xong rồi mới đóng ở một chỗ duy nhất.
Bên nhận không bao giờ đóng, vì nó không biết bên gửi còn định gửi nữa hay không.