go channel close
2018-06-11 本文已影响0人
SongLiang
channel
goroutine - 可以大致理解为一种轻量级的线程(或微线程),它是一种“分配在同一个地址空间内的,能够并行执行的函数”。同时,它是轻量级的,不需要像分配线程那样分配独立的栈空间。
send_onldy & recv_only channel
ic_send_only := make (<-chan int) //a channel that can only send data - arrow going out is sending
ic_recv_only := make (chan<- int) //a channel that can only receive a data - arrow going in is receiving
<-chan int 表示从 channel 中发送出去,所以是send only
chan<- int 表示发送数据到 channel 去,所以是recv only
关闭 channel
ch := make(chan bool)
close(ch)
close(ch) // 这样会panic的,channel不能close两次
对同一个 channel 进行两次 close,会报 panic 错误
向已经关闭的channel写数据
ch := make(chan string)
close(ch)
ch <- "good" // 会panic的
关闭 channel 之后,不可以向 channel 里发送信息,不然会报 panic 错误
从已经关闭的channel读取数据
- 无缓冲channel或者缓冲channel已经读取完毕
对于 string,读出来的是空字符串 “”
对于 int,读出来的是 0
对于 bool,读出来的是 false - 缓冲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")
}