golang——channel笔记

1.for i := range channel {

  //...

}

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

2.

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

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

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

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

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

 import "fmt"

 func push(c chan int, id string) {
for i := ; i < ; i++ {
c <- i
}
sync <- true
fmt.Println(id)
} var sync chan bool func main() {
sync = make(chan bool, )
ch := make(chan int, )
go push(ch, "A")
go push(ch, "B")
<-sync
<-sync
close(ch)//不关闭将导致deadlock
for j := range ch {
fmt.Println("parent:", j)
}
}

4.无缓存与有缓存channel:

 func main() {
//ch = make(chan int, 1)//有缓冲
//ch = make(chan int)//无缓冲
select {
case <-ch:
print("A")
case ch <- :
print("B")//有缓冲输出B
default:
print("C")//无缓冲输出C
}
}

个人认为,无缓冲相当于有1个单位的缓冲这种说法欠佳,事实上无缓冲channel需要Read端和Write端均准备好才能发生RW操作,否则死锁;

但Read一个nil的有缓冲channel依然会死锁。

记住:channel是为通信而生的,你拿起电话不会是为了跟自己说话

上一篇:将eclipse的应用程序打包成.exe


下一篇:结构体struts的长度