• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    go语言使用range来接收通道里面的数据

    发布者: 琛瑞6678 | 发布时间: 2025-8-14 13:45| 查看数: 63| 评论数: 0|帖子模式

    在 Go 语言中,可以使用
    1. for ... range
    复制代码
    循环来遍历通道(channel)。
    1. for ... range
    复制代码
    循环会一直从通道中接收值,直到通道关闭并且所有值都被接收完毕。

    使用 for ... range 遍历通道


    示例代码

    下面是一个使用
    1. for ... range
    复制代码
    遍历通道的示例:
    1. package main

    2. import (
    3.         "fmt"
    4.         "time"
    5. )

    6. func main() {
    7.         // 创建一个有缓冲的通道
    8.         ch := make(chan int, 5)

    9.         // 启动一个 goroutine 向通道发送值
    10.         go func() {
    11.                 for i := 0; i < 5; i++ {
    12.                         ch <- i
    13.                         time.Sleep(100 * time.Millisecond) // 模拟耗时操作
    14.                 }
    15.                 close(ch) // 关闭通道
    16.         }()

    17.         // 使用 for ... range 遍历通道
    18.         for value := range ch {
    19.                 fmt.Println("Received:", value)
    20.         }
    21. }
    复制代码



    解释

    创建通道
    1. ch := make(chan int, 5)
    复制代码

      1. make(chan int, 5)
      复制代码
      创建一个容量为 5 的有缓冲通道。
    启动 goroutine 发送值
    1. go func() {
    2.     for i := 0; i < 5; i++ {
    3.         ch <- i
    4.         time.Sleep(100 * time.Millisecond) // 模拟耗时操作
    5.     }
    6.     close(ch) // 关闭通道
    7. }()
    复制代码

    • 启动一个 goroutine,向通道发送 0 到 4 的整数。
      1. time.Sleep(100 * time.Millisecond)
      复制代码
      模拟耗时操作,使发送操作之间有时间间隔。
      1. close(ch)
      复制代码
      关闭通道,表示不再发送新的值。
    使用
    1. for ... range
    复制代码
    遍历通道
    1. for value := range ch {
    2.     fmt.Println("Received:", value)
    3. }
    复制代码

      1. for value := range ch
      复制代码
      循环会一直从通道中接收值,直到通道关闭并且所有值都被接收完毕。
    • 每次接收到一个值,都会打印出来。

    注意事项


    • 关闭通道

      • 必须在发送完所有值后关闭通道,否则
        1. for ... range
        复制代码
        循环会一直阻塞,等待新的值。
      • 关闭通道后,不能再向通道发送值,否则会引发 panic。

    • 多接收者

      • 如果有多个 goroutine 同时从同一个通道接收值,可能会出现竞争条件。建议使用互斥锁或其他同步机制来确保线程安全。

    • 空通道

      • 对于无缓冲通道,如果没有接收者,发送操作会阻塞,直到有接收者准备接收值。


    示例:多接收者

    下面是一个多接收者从同一个通道接收值的示例:
    1. package main

    2. import (
    3.         "fmt"
    4.         "sync"
    5.         "time"
    6. )

    7. func main() {
    8.         // 创建一个有缓冲的通道
    9.         ch := make(chan int, 5)

    10.         // 启动一个 goroutine 向通道发送值
    11.         go func() {
    12.                 for i := 0; i < 5; i++ {
    13.                         ch <- i
    14.                         time.Sleep(100 * time.Millisecond) // 模拟耗时操作
    15.                 }
    16.                 close(ch) // 关闭通道
    17.         }()

    18.         // 使用 sync.WaitGroup 等待所有接收者完成
    19.         var wg sync.WaitGroup

    20.         // 启动多个接收者 goroutine
    21.         for i := 0; i < 3; i++ {
    22.                 wg.Add(1)
    23.                 go func(id int) {
    24.                         defer wg.Done()
    25.                         for value := range ch {
    26.                                 fmt.Printf("Receiver %d received: %d\n", id, value)
    27.                         }
    28.                 }(i)
    29.         }

    30.         // 等待所有接收者完成
    31.         wg.Wait()
    32. }
    复制代码
    解释

    启动多个接收者 goroutine
    1. for i := 0; i < 3; i++ {
    2.     wg.Add(1)
    3.     go func(id int) {
    4.         defer wg.Done()
    5.         for value := range ch {
    6.             fmt.Printf("Receiver %d received: %d\n", id, value)
    7.         }
    8.     }(i)
    9. }
    复制代码

    • 启动三个接收者 goroutine,每个 goroutine 都使用
      1. for ... range
      复制代码
      循环从通道中接收值。
      1. wg.Add(1)
      复制代码
      增加 WaitGroup 的计数。
      1. defer wg.Done()
      复制代码
      在 goroutine 结束时减少 WaitGroup 的计数。
    等待所有接收者完成
    1. wg.Wait()
    复制代码

    • 使用
      1. wg.Wait()
      复制代码
      等待所有接收者 goroutine 完成。
    通过使用
    1. for ... range
    复制代码
    循环,可以方便地遍历通道中的值,直到通道关闭并且所有值都被接收完毕。这对于处理并发任务和数据流非常有用。
    到此这篇关于go语言使用range来接收通道里面的数据的文章就介绍到这了,更多相关go语言range接收数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表