通道:channel
名詞:在 goroutine 中通信的管道
注意:任何時候,同一時刻只能有一個 goroutine 訪問通道進行發送和獲取數據
通道的順序:遵循先入先出的規則
通道的定義
// 定義一個通道
var 變量名 chan 數據類型
// 比如:
var intCh chan int64
var strCh chan string
var mapCh chan map[string]any
注意:通道必須使用 make 函數進行初始化,只定義不能使用,報錯空指針
// 初始化通道
intch := make(chan int64)
strch := make(chan string)
prtch := make(chan *int64)
通過通道發送數據
// 發送數據
通道名 <- 數據
// 比如:
intCh <- 10 // 把10發送到通道intCh中
strCh <- "alisleepy" // 把字符串alisleepy發送到通道strCh中
通過通道接收數據
// 接收數據
var intCh chan int
intCh <- 10 // 給發送數據到intCh中
// 定義另一個通道,接收數據
recIntCh := make(chan int)
recData := <- recIntCh // 表示把recIntCh通道的數據取出來賦值給data
通道的 4 種接收方式
-
阻塞接收數據
// 執行該語句時發生阻塞,一直直到接收到數據並賦值給data data := <-intCh
-
非阻塞接收數據
data, ok := <-intCh // data : 表示接收到的數據 // ok:表示是否成功接收到數據,如果ok爲否,則表示未接收到數據,data的值爲通道的零值
注意:非阻塞式的接收方式實際使用很少,會造成高 CPU 使用
-
只接受收據,忽略接收的值
// 該語句會發生阻塞,直到接收到數據 <- intCh // 只接收數據,不把接收的值賦給其他變量
-
循環接收通道內的數據
// 使用for range循環接收 for data := range intCh { // todo:接收數據後的一些處理事項 }
單向通道
- 單向通道聲明方式
// 只能發送數據的通道
var 變量名 chan<- 數據類型
比如:var intCh chan<- int // intCh只能發送數據,箭頭是數據流向,指向chan,表示數據只能發送到chan
// 只能接收收據的通道
var 變量名 <-chan 數據類型
比如:var strCh <-chan string
帶緩衝的通道
1.創建帶緩衝的通道
// 增加一個參數,緩衝區大小
var intCh := make(chan int, 10) // 緩衝區大小爲10
通道的多路複用-同時接收和發送多個通道的數據
- 描述:就是一條通道上,可以同時接收和發送,比如:電話線
- 關鍵字:
- select:可以在程序中同時處理多個通道的操作,包括:發送數據、接收數據
- case:case 中的操作必然是一個通道的收發過程
select{
case 操作1:
響應操作1
case 操作2:
響應操作2
default:
沒有操作的處理
}