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 - 流媒体,分布式,即时通信

赞同来自:

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

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

赞同来自:

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

guang7night

赞同来自:

看看你的for的判断,噗

要回复问题请先登录注册