go 語言中使用 channel 和 goroutine 通信。創(chuàng)建 channel 后,goroutine 可以通過
Go 語言中通過 channel 與 goroutine 通信
在 Go 語言中,channel 是用于在 goroutine 之間通信的一種并發(fā)機(jī)制。它允許 goroutine 在不同線程中交換數(shù)據(jù),從而實(shí)現(xiàn)高性能并發(fā)編程。
創(chuàng)建 channel
要?jiǎng)?chuàng)建一個(gè) channel,可以使用 make 函數(shù):
ch := make(chan int)
登錄后復(fù)制
make 函數(shù)的第一個(gè)參數(shù)指定 channel 的數(shù)據(jù)類型。在上面的示例中,我們創(chuàng)建了一個(gè)整型 channel。
發(fā)送數(shù)據(jù)
要向 channel 發(fā)送數(shù)據(jù),可以使用 <- 運(yùn)算符:
ch <- 42
登錄后復(fù)制
這會(huì)將值 42 發(fā)送到 channel 中。
接收數(shù)據(jù)
要從 channel 中接收數(shù)據(jù),可以使用 <- 運(yùn)算符:
v := <- ch
登錄后復(fù)制
這會(huì)在 channel 中接收一個(gè)值并將其存儲(chǔ)在變量 v 中。
實(shí)戰(zhàn)案例
下面是一個(gè)實(shí)戰(zhàn)案例,展示了如何使用 channel 讓 goroutine 向主線程發(fā)送數(shù)據(jù):
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
ch := make(chan int)
// 啟動(dòng)一個(gè) goroutine 來向 channel 發(fā)送數(shù)據(jù)
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // 關(guān)閉 channel 以表示發(fā)送完成
}()
// 從 channel 中接收數(shù)據(jù)并打印
for v := range ch {
fmt.Println(v)
}
wg.Wait() // 等待 goroutine 完成
}
登錄后復(fù)制
在這個(gè)示例中,我們創(chuàng)建一個(gè) goroutine,它向 channel 發(fā)送 10 個(gè)值(0 到 9)。主 goroutine 從 channel 中接收數(shù)據(jù)并打印它。close(ch) 語句用于關(guān)閉 channel,表示 goroutine 已發(fā)送所有數(shù)據(jù)。
通過使用 channel,我們可以輕松地讓 goroutine 在不同的線程中交換數(shù)據(jù),從而實(shí)現(xiàn)高效的并發(fā)編程。






