通道: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:
沒有操作的處理
}