Go channel 介紹

Undefined443發表於2024-05-23

Go 語言(Golang)中的 chan 是通道(channel)的縮寫,用於在不同的 goroutine 之間進行通訊。通道允許你在 goroutine 之間傳遞資料,從而實現同步和共享記憶體。下面是關於 Go 語言中通道的詳細介紹和一些常見的用法示例。

建立通道

通道的建立使用 make 函式:

ch := make(chan int)

這裡建立了一個傳遞 int 型別資料的通道。你也可以建立傳遞其他型別資料的通道,比如 stringstruct 等。

傳送和接收資料

可以使用通道的傳送和接收運算子 <- 來傳送和接收資料:

// 傳送資料到通道
ch <- 42

// 從通道接收資料
value := <-ch

使用 goroutine 和通道示例

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)

    // 啟動一個新的 goroutine
    go func() {
        time.Sleep(2 * time.Second) // 模擬一些工作
        ch <- 42                    // 傳送資料到通道
    }()

    fmt.Println("等待資料...")
    value := <-ch // 阻塞,直到接收到資料
    fmt.Printf("收到資料:%d\n", value)
}

帶緩衝通道

通道可以是帶緩衝的,使用帶緩衝的通道可以在傳送操作和接收操作之間有一定的緩衝區,從而避免在傳送時阻塞:

ch := make(chan int, 2)

// 傳送資料到帶緩衝通道
ch <- 1
ch <- 2

// 接收資料
value1 := <-ch
value2 := <-ch

關閉通道

當你確定不會再向通道傳送資料時,可以關閉通道。注意,關閉通道後再傳送資料會引發 panic:

ch := make(chan int)

// 啟動一個 goroutine 接收資料
go func() {
    for value := range ch {
        fmt.Println(value)
    }
}()

// 傳送資料
ch <- 1
ch <- 2
ch <- 3

// 關閉通道
close(ch)

select 語句

select 語句用於在多個通道操作中進行選擇,類似於 switch 語句,但每個 case 都是一個通道操作:

ch1 := make(chan int)
ch2 := make(chan int)

go func() {
    time.Sleep(1 * time.Second)
    ch1 <- 1
}()

go func() {
    time.Sleep(2 * time.Second)
    ch2 <- 2
}()

for i := 0; i < 2; i++ {
    select {
    case value1 := <-ch1:
        fmt.Printf("收到 ch1 的資料:%d\n", value1)
    case value2 := <-ch2:
        fmt.Printf("收到 ch2 的資料:%d\n", value2)
    }
}

總結

通道是 Go 語言中用於 goroutine 之間通訊的重要機制。透過使用通道,你可以在不同的 goroutine 之間傳遞資料,實現同步和共享記憶體。熟練掌握通道的使用方式,可以幫助你編寫高效併發的 Go 程式。

相關文章