欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go語言使用range來接收通道里面的數(shù)據(jù)

 更新時間:2025年04月14日 09:38:56   作者:Achilles.Wang  
本文主要介紹了go語言使用range來接收通道里面的數(shù)據(jù),for ... range?循環(huán)會一直從通道中接收值,直到通道關(guān)閉并且所有值都被接收完畢,下面就來介紹一下,感興趣的可以了解一下

在 Go 語言中,可以使用 for ... range 循環(huán)來遍歷通道(channel)。for ... range 循環(huán)會一直從通道中接收值,直到通道關(guā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) // 關(guān)閉通道
	}()

	// 使用 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) // 關(guān)閉通道
}()
  • 啟動一個 goroutine,向通道發(fā)送 0 到 4 的整數(shù)。
  • time.Sleep(100 * time.Millisecond) 模擬耗時操作,使發(fā)送操作之間有時間間隔。
  • close(ch) 關(guān)閉通道,表示不再發(fā)送新的值。

使用 for ... range 遍歷通道

for value := range ch {
    fmt.Println("Received:", value)
}
  • for value := range ch 循環(huán)會一直從通道中接收值,直到通道關(guān)閉并且所有值都被接收完畢。
  • 每次接收到一個值,都會打印出來。

注意事項

  • 關(guān)閉通道

    • 必須在發(fā)送完所有值后關(guān)閉通道,否則 for ... range 循環(huán)會一直阻塞,等待新的值。
    • 關(guān)閉通道后,不能再向通道發(fā)送值,否則會引發(fā) panic。
  • 多接收者

    • 如果有多個 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) // 關(guān)閉通道
	}()

	// 使用 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 結(jié)束時減少 WaitGroup 的計數(shù)。

等待所有接收者完成

wg.Wait()
  • 使用 wg.Wait() 等待所有接收者 goroutine 完成。

通過使用 for ... range 循環(huán),可以方便地遍歷通道中的值,直到通道關(guān)閉并且所有值都被接收完畢。這對于處理并發(fā)任務(wù)和數(shù)據(jù)流非常有用。

到此這篇關(guān)于go語言使用range來接收通道里面的數(shù)據(jù)的文章就介紹到這了,更多相關(guān)go語言range接收數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何解決golang定時器引發(fā)的id重復(fù)問題

    詳解如何解決golang定時器引發(fā)的id重復(fù)問題

    這篇文章主要為大家詳細介紹了如何解決golang定時器引發(fā)的id重復(fù)問題,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04
  • 一文了解Go語言的并發(fā)特性

    一文了解Go語言的并發(fā)特性

    本文主要介紹了一文了解Go語言的并發(fā)特性,通過輕量級線程、通道及選擇語句,使得并發(fā)編程變得既簡單又高效,下面就來具體了解一下如何使用,感興趣的可以了解一下
    2024-02-02
  • GoLang BoltDB數(shù)據(jù)庫詳解

    GoLang BoltDB數(shù)據(jù)庫詳解

    這篇文章主要介紹了GoLang BoltDB數(shù)據(jù)庫,boltdb是使用Go語言編寫的開源的鍵值對數(shù)據(jù)庫,boltdb存儲數(shù)據(jù)時 key和value都要求是字節(jié)數(shù)據(jù),此處需要使用到 序列化和反序列化
    2023-02-02
  • Go單元測試對GORM進行Mock測試

    Go單元測試對GORM進行Mock測試

    這篇文章主要為大家介紹了Go單元測試對GORM進行Mock測試用例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 深入理解Go語言的容器包

    深入理解Go語言的容器包

    Go語言的container標準包包含了堆(heap)、鏈表(list)和環(huán)(ring)三種數(shù)據(jù)結(jié)構(gòu),本文就來詳細的介紹一下這三種的使用,感興趣的可以了解一下
    2024-10-10
  • golang切片內(nèi)存應(yīng)用技巧詳解

    golang切片內(nèi)存應(yīng)用技巧詳解

    這篇文章主要介紹了golang切片內(nèi)存應(yīng)用技巧詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Golang語言如何高效拼接字符串詳解

    Golang語言如何高效拼接字符串詳解

    最近在做性能優(yōu)化,有個函數(shù)里面的耗時特別長,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其實有很多種實現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Golang語言如何高效拼接字符串的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • GO中對map排序的實現(xiàn)

    GO中對map排序的實現(xiàn)

    本文主要介紹了GO中對map排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Golang?Gin框架獲取請求參數(shù)的幾種常見方式

    Golang?Gin框架獲取請求參數(shù)的幾種常見方式

    在我們平常添加路由處理函數(shù)之后,就可以在路由處理函數(shù)中編寫業(yè)務(wù)處理代碼了,但在此之前我們往往需要獲取請求參數(shù),本文就詳細的講解下gin獲取請求參數(shù)常見的幾種方式,需要的朋友可以參考下
    2024-02-02
  • 詳解Go并發(fā)編程時如何避免發(fā)生競態(tài)條件和數(shù)據(jù)競爭

    詳解Go并發(fā)編程時如何避免發(fā)生競態(tài)條件和數(shù)據(jù)競爭

    大家都知道,Go是一種支持并發(fā)編程的編程語言,但并發(fā)編程也是比較復(fù)雜和容易出錯的。比如本篇分享的問題:競態(tài)條件和數(shù)據(jù)競爭的問題
    2023-04-04

最新評論