【go】golang中的通道

alisleepy發表於2024-04-08

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

相關文章