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是爲通訊而生的,你拿起電話不會是爲了跟本身說話