Golang channel 特性
最近在项目中遇到了 Go channel 的一些问题,在此记录下 close channel 的一些特性。
- 关闭channel
ch := make(chan bool) close(ch) close(ch) // 这样会panic的,channel不能close两次
- 向已经关闭的channel写数据
ch := make(chan string) close(ch) ch <- "good" // 会panic的
- 从已经关闭的channel读取数据
需要分两种情况:- 无缓冲channel或者缓冲channel已经读取完毕
- 缓冲channel未读取完毕,可以继续读取channel中的剩余的数据
//无缓冲channel ch := make(chan string) close(ch) i := <- ch // 不会panic, i读取到的值是空 "", 如果channel是bool的,那么读取到的是false
- 判断channel是否关闭
i, ok := <- ch if ok { println(i) } else { println("channel closed") }