1.for i := range channel {缓存
//...多线程
}spa
至关于 循环进行 i<-channel,直至close(channel)线程
2.code
· 给一个 nil channel 发送数据,形成永远阻塞blog
· 从一个 nil channel 接收数据,形成永远阻塞同步
· 给一个已经关闭的 channel 发送数据,引发 panicstring
· 从一个已经关闭的 channel 接收数据,当即返回一个零值it
3.一个多线程同步的例子class
1 import "fmt" 2 3 func push(c chan int, id string) { 4 for i := 0; i < 10; i++ { 5 c <- i 6 } 7 sync <- true 8 fmt.Println(id) 9 } 10 11 var sync chan bool 12 13 func main() { 14 sync = make(chan bool, 1) 15 ch := make(chan int, 20) 16 go push(ch, "A") 17 go push(ch, "B") 18 <-sync 19 <-sync 20 close(ch)//不关闭将致使deadlock 21 for j := range ch { 22 fmt.Println("parent:", j) 23 } 24 }
4.无缓存与有缓存channel:
1 func main() { 2 //ch = make(chan int, 1)//有缓冲 3 //ch = make(chan int)//无缓冲 4 select { 5 case <-ch: 6 print("A") 7 case ch <- 1: 8 print("B")//有缓冲输出B 9 default: 10 print("C")//无缓冲输出C 11 } 12 }
我的认为,无缓冲至关于有1个单位的缓冲这种说法欠佳,事实上无缓冲channel须要Read端和Write端均准备好才能发生RW操做,不然死锁;
但Read一个nil的有缓冲channel依然会死锁。
记住:channel是为通讯而生的,你拿起电话不会是为了跟本身说话