go channel问题

package main
import (
    "fmt"
    "time"
)

func  printCount(c chan int){
    num := 0
    for num >= 0{
        num = <-c
        fmt.Print(num," ")
    }
}

func main(){
    c := make(chan int)
    a := []int{8,6,7,5,3,0,9,-1}

    go printCount(c)
    for _,v := range a{
        c <- v
    }

   time.Sleep(time.Millisecond * 1)
   fmt.Println("End of main")
}

上述代码输出8,6,7,5,3,0,9,-1 end of main ,为什么-1会输出呀 把time.Sleep()注释后就不会输出-1,这是为啥

已邀请:

simple - 既要有梦想,又要有实力

赞同来自: elangx

按你代码的逻辑,-1应该一定会被print的,只所以没有被print,可能是main线程先结束,导致printCount 没有来得及执行完就结束了,如果你加上延时,会让printCount执行完才结束。 为了保证所有子线程都结束,main才能结束你可以试试sync.WaitGroup

willee

赞同来自: emacsist

输出-1或者不输出-1都只是巧合,可能你多运行几次就会有不相同的结果,并发的特性

lmw - hello world

赞同来自: ilmari

  1. <-c 等于 -1的时候 num=9 ,so..
  2. time.Sleep 去掉 -1依然能输出(有时候不输出) ,主程序运行速度不固定,有时候主程序执行完的时候 goroutine 还没完,就看不到-1了

emacsist - https://emacsist.github.io

赞同来自: ilmari

题主是想控制如何在 main goroutine 里等待其他的 goroutine 退出吗?

vr

赞同来自: ilmari

由于你的channel c 的buffer 为0, 所以printCount goroutine 和 main 函数的 for range 循环要互相等待,所以事实上, main goroutine : for range a 数组的每一个值 并: c <- v printCount goroutine: 都会接受到 num := <-c

如果加上time.sleep 1秒,则printCount 有机会执行 fmt.Print(num, " ") 这一句 反之几乎没有机会打印a数组最后一个值-1,main直接结束

sheepbao - 爱go,爱编程,专注网络开发,流媒体、分布式、网络加速,欢迎讨论listomebao@gmail.com

赞同来自:

printCount 里先比较num的大小再输出,if num >= 0 {print(num)}

changjixiong - 时常做白日梦的程序员

赞同来自:

没来得及说出最后一句话,就被杀死了。

guang7night

赞同来自:

看看你的for的判断,噗

要回复问题请先登录注册