最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

在 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。
  • 多接收者

    • 如果有多個 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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 深入理解Go設計模式之代理模式

    深入理解Go設計模式之代理模式

    代理模式是一種結構型設計模式,?其中代理控制著對于原對象的訪問,?并允許在將請求提交給原對象的前后進行一些處理,從而增強原對象的邏輯處理,這篇文章主要來學習一下代理模式的構成和用法,需要的朋友可以參考下
    2023-05-05
  • Golang中gorm無法將字段更新為空值

    Golang中gorm無法將字段更新為空值

    本文主要介紹了Golang中gorm無法將字段更新為空值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • golang 輸出重定向:fmt Log,子進程Log,第三方庫logrus的詳解

    golang 輸出重定向:fmt Log,子進程Log,第三方庫logrus的詳解

    這篇文章主要介紹了golang 輸出重定向:fmt Log,子進程Log,第三方庫logrus的詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Debian 多版本共存 Go 安裝教程

    Debian 多版本共存 Go 安裝教程

    這篇文章介紹了在Debian系統(tǒng)上實現(xiàn)多版本Go共存的詳細方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-04-04
  • 一文帶你深入理解Golang中的泛型

    一文帶你深入理解Golang中的泛型

    Go?在泛型方面一直被詬病,因為它在這方面相對比較落后。但是,在?Go?1.18?版本中,泛型已經(jīng)被正式引入,成為了?Go?語言中一個重要的特性。本文將會詳細介紹?Go?泛型的相關概念,語法和用法,希望能夠幫助大家更好地理解和應用這一特性
    2023-05-05
  • Golang實現(xiàn)EasyCache緩存庫實例探究

    Golang實現(xiàn)EasyCache緩存庫實例探究

    這篇文章主要為大家介紹了Golang實現(xiàn)EasyCache緩存庫實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Go語言中切片(slice)和數(shù)組(array)的區(qū)別詳解

    Go語言中切片(slice)和數(shù)組(array)的區(qū)別詳解

    Go語言中切片(slice)和數(shù)組(array)是兩種不同的數(shù)據(jù)結構,它們在用法和行為上有一些重要區(qū)別,所以本文就通過一些代碼示例給大家詳細的介紹一下Go語言中切片(slice)和數(shù)組(array)的區(qū)別,需要的朋友可以參考下
    2023-09-09
  • Windows中Golang編譯運行緩慢的解決方法

    Windows中Golang編譯運行緩慢的解決方法

    Go語言編譯運行緩慢問題可能是由于Windows 11更新引入的PCManagerServiceStore進程導致的,該進程會強制檢查Go代碼編譯過程,消耗大量系統(tǒng)資源,下面就來介紹一下該問題的解決
    2025-08-08
  • golang中的container/heap包使用

    golang中的container/heap包使用

    Golang中的container/heap包提供堆操作,適用于實現(xiàn)了heap.Interface的類型,本文主要介紹了golang中的container/heap包使用,感興趣的可以了解一下
    2025-02-02
  • 談論Go 什么時候會觸發(fā) GC問題

    談論Go 什么時候會觸發(fā) GC問題

    Go 語言作為一門新語言,在早期經(jīng)常遭到唾棄的就是在垃圾回收(下稱:GC)機制中 STW(Stop-The-World)的時間過長。下面文章就對此話題展開,感興趣的小伙伴可以參考下面文章的內(nèi)容
    2021-09-09

最新評論

塔城市| 衡东县| 巴里| 台中县| 伊春市| 涟源市| 凤阳县| 连山| 苗栗市| 普安县| 中西区| 中阳县| 龙州县| 通榆县| 罗城| 鹰潭市| 北安市| 郸城县| 临江市| 宿迁市| 沧源| 潍坊市| 克山县| 新密市| 定结县| 岳池县| 峨山| 慈溪市| 重庆市| 东阿县| 专栏| 满洲里市| 晴隆县| 裕民县| 靖远县| 都匀市| 西藏| 容城县| 邢台县| 广西| 叙永县|