go語言使用range來接收通道里面的數(shù)據(jù)
在 Go 語言中,可以使用 for ... range 循環(huán)來遍歷通道(channel)。for ... range 循環(huán)會一直從通道中接收值,直到通道關閉并且所有值都被接收完畢。
使用 for ... range 遍歷通道
示例代碼
下面是一個使用 for ... range 遍歷通道的示例:
package main
import (
"fmt"
"time"
)
func main() {
// 創(chuàng)建一個有緩沖的通道
ch := make(chan int, 5)
// 啟動一個 goroutine 向通道發(fā)送值
go func() {
for i := 0; i < 5; i++ {
ch <- i
time.Sleep(100 * time.Millisecond) // 模擬耗時操作
}
close(ch) // 關閉通道
}()
// 使用 for ... range 遍歷通道
for value := range ch {
fmt.Println("Received:", value)
}
}

解釋
創(chuàng)建通道:
ch := make(chan int, 5)
make(chan int, 5)創(chuàng)建一個容量為 5 的有緩沖通道。
啟動 goroutine 發(fā)送值:
go func() {
for i := 0; i < 5; i++ {
ch <- i
time.Sleep(100 * time.Millisecond) // 模擬耗時操作
}
close(ch) // 關閉通道
}()
- 啟動一個 goroutine,向通道發(fā)送 0 到 4 的整數(shù)。
time.Sleep(100 * time.Millisecond)模擬耗時操作,使發(fā)送操作之間有時間間隔。close(ch)關閉通道,表示不再發(fā)送新的值。
使用 for ... range 遍歷通道:
for value := range ch {
fmt.Println("Received:", value)
}
for value := range ch循環(huán)會一直從通道中接收值,直到通道關閉并且所有值都被接收完畢。- 每次接收到一個值,都會打印出來。
注意事項
關閉通道:
- 必須在發(fā)送完所有值后關閉通道,否則
for ... range循環(huán)會一直阻塞,等待新的值。 - 關閉通道后,不能再向通道發(fā)送值,否則會引發(fā) panic。
- 必須在發(fā)送完所有值后關閉通道,否則
多接收者:
- 如果有多個 goroutine 同時從同一個通道接收值,可能會出現(xiàn)競爭條件。建議使用互斥鎖或其他同步機制來確保線程安全。
空通道:
- 對于無緩沖通道,如果沒有接收者,發(fā)送操作會阻塞,直到有接收者準備接收值。
示例:多接收者
下面是一個多接收者從同一個通道接收值的示例:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// 創(chuàng)建一個有緩沖的通道
ch := make(chan int, 5)
// 啟動一個 goroutine 向通道發(fā)送值
go func() {
for i := 0; i < 5; i++ {
ch <- i
time.Sleep(100 * time.Millisecond) // 模擬耗時操作
}
close(ch) // 關閉通道
}()
// 使用 sync.WaitGroup 等待所有接收者完成
var wg sync.WaitGroup
// 啟動多個接收者 goroutine
for i := 0; i < 3; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
for value := range ch {
fmt.Printf("Receiver %d received: %d\n", id, value)
}
}(i)
}
// 等待所有接收者完成
wg.Wait()
}
解釋
啟動多個接收者 goroutine:
for i := 0; i < 3; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
for value := range ch {
fmt.Printf("Receiver %d received: %d\n", id, value)
}
}(i)
}
- 啟動三個接收者 goroutine,每個 goroutine 都使用
for ... range循環(huán)從通道中接收值。 wg.Add(1)增加 WaitGroup 的計數(shù)。defer wg.Done()在 goroutine 結束時減少 WaitGroup 的計數(shù)。
等待所有接收者完成:
wg.Wait()
- 使用
wg.Wait()等待所有接收者 goroutine 完成。
通過使用 for ... range 循環(huán),可以方便地遍歷通道中的值,直到通道關閉并且所有值都被接收完畢。這對于處理并發(fā)任務和數(shù)據(jù)流非常有用。
到此這篇關于go語言使用range來接收通道里面的數(shù)據(jù)的文章就介紹到這了,更多相關go語言range接收數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang 輸出重定向:fmt Log,子進程Log,第三方庫logrus的詳解
這篇文章主要介紹了golang 輸出重定向:fmt Log,子進程Log,第三方庫logrus的詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Golang實現(xiàn)EasyCache緩存庫實例探究
這篇文章主要為大家介紹了Golang實現(xiàn)EasyCache緩存庫實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
Go語言中切片(slice)和數(shù)組(array)的區(qū)別詳解
Go語言中切片(slice)和數(shù)組(array)是兩種不同的數(shù)據(jù)結構,它們在用法和行為上有一些重要區(qū)別,所以本文就通過一些代碼示例給大家詳細的介紹一下Go語言中切片(slice)和數(shù)組(array)的區(qū)別,需要的朋友可以參考下2023-09-09

