1. channel关闭后读操作
关闭channel后,已经写入的正常读取完,继续读的话是类型的零值(int类型的话就是0)
package main
import "fmt"
func main() {
ch := make(chan int, 3)
for i := 0; i < 3; i++ {
ch <- i
}
close(ch)
for i := 0; i < 4; i++ {
value := <-ch
fmt.Println("value:", value)
}
}
输出:
value: 0
value: 1
value: 2
value: 0
2. channel关闭后写操作
会报panic: send on closed channel
package main
func main() {
ch := make(chan int, 3)
for i := 0; i < 3; i++ {
ch <- i
}
close(ch)
ch <- 4
}
输出:
panic: send on closed channel
// ...
看下运行时源码runtime/chan.go
func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool {
// ...
if c.closed != 0 {
unlock(&c.lock)
panic(plainError("send on closed channel"))
}
// ..
}
3. channel关闭后再次关闭
panic: send on closed channel
package main
func main() {
ch := make(chan int, 3)
for i := 0; i < 3; i++ {
ch <- i
}
close(ch)
close(ch)
}
输出
panic: send on closed channel
// ...
看下运行时源码runtime/chan.go
func closechan(c *hchan) {
//...
if c.closed != 0 {
unlock(&c.lock)
panic(plainError("close of closed channel"))
}
// ...
}