C1. 以下操作會引起panic
- P1. Closing the nil channel.
實例:
func C1P1() {
var ch chan int
close(ch)
}
結果
panic: close of nil channel
goroutine 1 [running]:
panic(0x458300, 0xc82000a170)
/home/wdy/go/src/runtime/panic.go:464 +0x3e6
main.main()
/home/wdy/learn/program-learn/golang/learnchannel.go:27 +0x1e
exit status 2
- P2. Closing a closed channel.
實例:
func C1P2() {
ch := make(chan int, 0)
close(ch)
close(ch)
}
結果:
panic: close of closed channel
goroutine 1 [running]:
panic(0x458300, 0xc82000a170)
/home/wdy/go/src/runtime/panic.go:464 +0x3e6
main.main()
/home/wdy/learn/program-learn/golang/learnchannel.go:27 +0x4d
exit status 2
- P3. Sending on a closed channel.
實例:
func C1P3() {
ch := make(chan int, 0)
close(ch)
ch <- 2
}
結果:
panic: send on closed channel
goroutine 1 [running]:
panic(0x458300, 0xc82000a170)
/home/wdy/go/src/runtime/panic.go:464 +0x3e6
main.main()
/home/wdy/learn/program-learn/golang/learnchannel.go:23 +0x6c
exit status 2
C2. 作為接受者的goroutine不要關閉channel,否則 發送者未來往這個channel發送數據時會panic
C3. 如果一個channel有多個發送者,發送者就不要關閉通道或者最后一個發送數據的goroutine來關閉通道。
Last one sender to leave, turns off the lights, which can be controlled by a atomic int
C4. 對于不再使用的通道不必顯示關閉。如果沒有goroutine引用這個通道,這個通道就會被垃圾回收。
注意如果需要把關閉通道作為一個控制信號告知其他goroutine沒有更多數據的情況下,需要顯示關閉。討論
C5. 通道和select搭配最佳。
C6. 如果在兩個goroutine中需要一個雙向溝通,考慮使用兩個單獨的單向通道。這樣兩個通道就可以通過調用close的方法來告知對方通訊終止。
C7. 如果通道沒有負責讀取的goroutine的時候,那么發送者就可能會永遠阻塞在該通道上。
C8. 當設計一個goroutine通過channel來提供服務的時候,在某個時刻這個goroutine不再需要了,要仔細考慮goroutine應該怎么結束。否則這個不再使用的goroutine會服務一個不受監管的channel。
C9. Dave Cheney's Four Channel Axioms :
- A1. 對一個 nil channel執行發送操作會一直阻塞。
實例:
func C9A1() {
fmt.Println("C9A1")
var ch chan int
ch <- 2
}
結果:
C9A1
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send (nil chan)]:
main.C9A1()
/home/wdy/learn/program-learn/golang/learnchannel.go:27 +0xf9
main.main()
/home/wdy/learn/program-learn/golang/learnchannel.go:37 +0x14
exit status 2
- A2. 對一個 nil channel執行接受操作會一直阻塞。樣例
你可能不知道的關于golang 的10件事情
發送:
func C9A2() {
fmt.Println("C9A2")
var ch chan int
<-ch
}
結果:
C9A2
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive (nil chan)]:
main.C9A2()
/home/wdy/learn/program-learn/golang/learnchannel.go:33 +0xec
main.main()
/home/wdy/learn/program-learn/golang/learnchannel.go:38 +0x14
exit status 2
A3. 發送到關閉的channel會引起panic
A4. 從關閉的cannel讀操作,會立刻返回數據0值。
C10. 'select' 從來不會選擇阻塞的case,意思就是如果select的多個case都阻塞了,那么當前goroutine就會阻塞在select上。
后記
之前一直在CSDN上寫文章,后面會逐步轉換到簡書上,還請大家多多支持。