dongxi5423 2019-02-12 18:47
浏览 15
已采纳

前往频道和延迟

I was just experimenting with Go channels on my Ubuntu 64 bit environment and got confused with the output the following program produced.

I got the output: 0 1 2 3 Exit

The output when I uncommented the two commented lines: 0 1 2 3 4 Exit

Please explain the behavior. TIA.

package main

import (
"fmt"
    //"time"
)

func main() {
    ch := make(chan int)
    done := make(chan bool)
    go func() {
        for i := 0; i < 5; i++ {
            ch <- i
        }
                //time.Sleep(1 * time.Second)
        done <- false
    }()
    go func() {
        for {
            select {
            case message := <-ch:
                fmt.Println(message)
            case <-done:
                return
            }
        }
    }()
    <-done
    fmt.Println("Exit")
}
  • 写回答

3条回答 默认 最新

  • dongsimang4036 2019-02-12 18:55
    关注

    You're not waiting for both goroutines, and only sending a single value over done to 2 receivers, which will deadlock if the second receiver happens to be main.

    Using a WaitGroup simplifies the code, and allows you to easily wait for as many goroutines as needed. https://play.golang.org/p/MWknv_9AFKp

    ch := make(chan int)
    var wg sync.WaitGroup
    
    wg.Add(1)
    go func() {
        defer wg.Done()
        defer close(ch)
        for i := 0; i < 5; i++ {
            ch <- i
        }
    }()
    
    wg.Add(1)
    go func() {
        defer wg.Done()
        for message := range ch {
            fmt.Println(message)
        }
    
    }()
    
    wg.Wait()
    fmt.Println("Exit")
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c