Go 語言(Golang)中的 chan
是通道(channel)的縮寫,用於在不同的 goroutine 之間進行通訊。通道允許你在 goroutine 之間傳遞資料,從而實現同步和共享記憶體。下面是關於 Go 語言中通道的詳細介紹和一些常見的用法示例。
建立通道
通道的建立使用 make
函式:
ch := make(chan int)
這裡建立了一個傳遞 int
型別資料的通道。你也可以建立傳遞其他型別資料的通道,比如 string
、struct
等。
傳送和接收資料
可以使用通道的傳送和接收運算子 <-
來傳送和接收資料:
// 傳送資料到通道
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 程式。