go - 由于 goroutine,main 即将退出

标签 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()

如果我将 receiver(c) 设为 go 例程,则只会打印“Main”,并且程序将退出而不等待 Scan() 函数。即使添加 time.Sleep(2) 也不会阻止程序退出。

为什么我的程序没有任何输入就退出了?

最佳答案

如果给定零参数,

Scan 将不会阻塞。

请注意,即使您给它一个参数,Playground 也不会阻塞 IO

var i int
fmt.Scan(&i)

也将无法阻止,如果你检查它返回的 error 值(第二个返回值),你会看到它报告 error: EOF.

(虽然那个样本会挡在 Playground 外面)。

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

关于go - 由于 goroutine,main 即将退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25925244/

相关文章:

go - 为什么Go在项目子目录中找不到导入包?

concurrency - 从不同的 goroutine 访问一个 channel

go - Go 中的僵尸协程

javascript - Go channel 与 JavaScript 生成器有何不同?

google-app-engine - 从 Google BigQuery 提取结果到云存储 golang

go - Rethinkdb 仅查询子数组

go - 如何在文件和结构中设置日期和日期数组

go - 强制 goroutines 进入同一个线程

go - 为什么 TrimLeft 不能按预期工作?

戈兰/ Gin : How to disable the "Found." link on HTTP redirect