[TOC]
## 五、channel
### (1)Channel讀寫特性(15字口訣)
首先,我們先復習一下Channel都有哪些特性?
* 給一個 nil channel 發送數據,造成永遠阻塞
* 從一個 nil channel 接收數據,造成永遠阻塞
* 給一個已經關閉的 channel 發送數據,引起 panic
* 從一個已經關閉的 channel 接收數據,如果緩沖區中為空,則返回一個零值
* 無緩沖的channel是同步的,而有緩沖的channel是非同步的
以上5個特性是死東西,也可以通過口訣來記憶:“空讀寫阻塞,寫關閉異常,讀關閉空零”。
> 執行下面的代碼發生什么?
> test17.go
```go
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 1000)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
}()
go func() {
for {
a, ok := <-ch
if !ok {
fmt.Println("close")
return
}
fmt.Println("a: ", a)
}
}()
close(ch)
fmt.Println("ok")
time.Sleep(time.Second * 100)
}
```
15字口訣:“空讀寫阻塞,寫關閉異常,讀關閉空零”,往已經關閉的channel寫入數據會panic的。因為main在開辟完兩個goroutine之后,立刻關閉了ch, 結果:
```
panic: send on closed channel
```
- 封面
- 第一篇:Golang修養必經之路
- 1、最常用的調試 golang 的 bug 以及性能問題的實踐方法?
- 2、Golang的協程調度器原理及GMP設計思想?
- 3、Golang中逃逸現象, 變量“何時棧?何時堆?”
- 4、Golang中make與new有何區別?
- 5、Golang三色標記+混合寫屏障GC模式全分析
- 6、面向對象的編程思維理解interface
- 7、Golang中的Defer必掌握的7知識點
- 8、精通Golang項目依賴Go modules
- 9、一站式精通Golang內存管理
- 第二篇:Golang面試之路
- 1、數據定義
- 2、數組和切片
- 3、Map
- 4、interface
- 5、channel
- 6、WaitGroup
- 第三篇、Golang編程設計與通用之路
- 1、流?I/O操作?阻塞?epoll?
- 2、分布式從ACID、CAP、BASE的理論推進
- 3、對于操作系統而言進程、線程以及Goroutine協程的區別
- 4、Go是否可以無限go? 如何限定數量?
- 5、單點Server的N種并發模型匯總
- 6、TCP中TIME_WAIT狀態意義詳解
- 7、動態保活Worker工作池設計