@Golang亿点小细节之close()
你所忽略的,往往才是Bug的起源
close() 前置知识
1.不能去close()一个已经close()的channel
package main
func main(){
ch := make(chan int)
close(ch)
close(ch)
// output:
// panic: close of closed channel
}
2.channel被close()后,不可以写入(注意会panic:send on closed channel),但可以读取。读取规则是如果有缓存值则读缓存值,没有缓存值则读零。注意:v, ok := <-ch
中ok
并不能去判断channel在何时关闭
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 < 5; i++ {
v, ok := <-ch
fmt.Println(v, ok)
}
fmt.Println(