1.for i := range channel {

  //...

}

相当于 循环进行 i<-channel,直至close(channel)

 

2.

· 给一个 nil channel 发送数据,造成永远阻塞

· 从一个 nil channel 接收数据,造成永远阻塞

· 给一个已经关闭的 channel 发送数据,引起 panic

· 从一个已经关闭的 channel 接收数据,立即返回一个零值

 

3.一个多线程同步的例子

 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是为通信而生的,你拿起电话不会是为了跟自己说话

 



 posted on 2016-03-17 11:54  Avery-Lyu  阅读(219)  评论(0编辑  收藏  举报