为了账号安全,请及时绑定邮箱和手机立即绑定

由于 goroutine,main 即将退出

由于 goroutine,main 即将退出

Go
手掌心 2021-08-16 19:14:05
我正在尝试重新实现/修改这篇文章的第二条评论的代码。我想要多个 go 例程从堆栈中弹出元素(只要堆栈包含某些内容),并使用另一个函数来捕获它们。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) 也不会阻止程序退出。为什么我的程序在没有任何输入的情况下退出?
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

Scan 如果给定零个参数,则不会阻塞。


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


var i int

fmt.Scan(&i)

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


(尽管该样本会在 Playground 之外被阻挡)。


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


查看完整回答
反对 回复 2021-08-16
  • 1 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信