主要退出很快,由于goroutine

时间:2014-09-19 02:05:05

标签: go goroutine

我正在尝试重新实现/修改this post的第二条评论的代码。

我希望多个go例程从堆栈中弹出元素(只要堆栈包含某些内容),以及另一个捕获它们的函数。

This code in playground

func  pop(list *[]int, c chan int) {
    if len(*list) != 0 {
        result := (*list)[0]
        *list = (*list)[1:]
        fmt.Println("about to send ",result)
        c <-  result
    } else {return}
}

func receiver (c chan int){
    result := <- c
    fmt.Println("received ", result)
}

var list = []int{1, 2, 3}

func main() {

fmt.Println("Main")
c := make(chan int)
go pop (&list, c)
go pop (&list,c)
receiver(c)
fmt.Scan()

如果我将接收器(c)作为一个常规程序,只有&#34;主要&#34;将打印,程序将退出而不等待Scan()函数。即使添加time.Sleep(2)也不会阻止程序退出。

为什么我的程序在没有任何输入的情况下退出?

1 个答案:

答案 0 :(得分:2)

如果给出零参数,

Scan将不会阻止。

请注意,即使您给它一个参数,代码

,Playground也不会阻止IO
var i int
fmt.Scan(&i)

同样无法阻止,如果您检查它返回的error值(第二个返回值),您应该看到它报告error: EOF

(虽然该样本会在游乐场外阻挡。)

编辑:如果你想在不创建虚拟变量的情况下阻止输入,请使用Scanln,尽管它仍然会在Playground上失败。