【发布时间】:2019-10-08 12:44:08
【问题描述】:
我正在通过tutorial 学习 Go 中的频道。 当我只向通道发送值时,它会出错。这是示例代码。
package main
import "fmt"
func main() {
ch := make(chan int)
ch <- 1
fmt.Println("Does not work")
}
在这里,我只是向频道发送价值,但没有收到任何东西。它给出了一个错误
fatal error: all goroutines are asleep - deadlock!
但是当我运行下面的代码时它没有给出任何错误
package main
import "fmt"
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // send sum to c
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
fmt.Println("did not receive but still works")
}
并打印
did not receive but still works
我不明白为什么它在第二种情况下有效,而在第一种情况下无效。即使在这两种情况下我都没有收到任何渠道的价值。还有是什么导致了第一种情况下的死锁以及在第二种情况下如何避免死锁?
【问题讨论】:
-
这个博客解释了你的问题link
-
第二种情况不起作用。它只是在可能出现死锁之前退出。为什么你会想要只发送到一个频道?
-
该链接解释了第一部分。但是按照这种逻辑,那么在第二种情况下也应该被卡住让某人读取值
-
每个 goroutine 被阻塞。但是您的程序在报告之前就退出了。