【go】golang中的通道

通道: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 種接收方式

  1. 阻塞接收數據

    // 執行該語句時發生阻塞,一直直到接收到數據並賦值給data
    data := <-intCh
    
  2. 非阻塞接收數據

     data, ok := <-intCh
     // data : 表示接收到的數據
     // ok:表示是否成功接收到數據,如果ok爲否,則表示未接收到數據,data的值爲通道的零值
    

    注意:非阻塞式的接收方式實際使用很少,會造成高 CPU 使用

  3. 只接受收據,忽略接收的值

    // 該語句會發生阻塞,直到接收到數據
     <- intCh  // 只接收數據,不把接收的值賦給其他變量
    
  4. 循環接收通道內的數據

     // 使用for range循環接收
     for data := range intCh {
         // todo:接收數據後的一些處理事項
     }
    

單向通道

  1. 單向通道聲明方式
// 只能發送數據的通道
var 變量名 chan<- 數據類型
比如:var intCh chan<- int  // intCh只能發送數據,箭頭是數據流向,指向chan,表示數據只能發送到chan
// 只能接收收據的通道
var 變量名 <-chan 數據類型
比如:var strCh <-chan string

帶緩衝的通道

1.創建帶緩衝的通道

// 增加一個參數,緩衝區大小
var intCh := make(chan int, 10)  // 緩衝區大小爲10

通道的多路複用-同時接收和發送多個通道的數據

  1. 描述:就是一條通道上,可以同時接收和發送,比如:電話線
  2. 關鍵字:
  • select:可以在程序中同時處理多個通道的操作,包括:發送數據、接收數據
  • case:case 中的操作必然是一個通道的收發過程
select{
    case 操作1:
        響應操作1
    case 操作2:
        響應操作2
    default:
        沒有操作的處理
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章