使用渠道进行测试时遇到了一个问题。
在正常的main函数中,以下代码将报告死锁错误。
package main
import (
"fmt"
)
func main() {
c := make(chan int)
c <- 1
fmt.Println(<-c)
}
但是在我的机器上,这个简单的测试似乎永远死锁或被阻塞,或者由于我不知道的任何原因而无法退出。我在Emacs和终端中都调用了该测试,并且得到了相同的结果。命令为go test -run TestChan\$ . -v -count=1
。我尝试使用更简单的命令(go test -run TestChan
),但仍得到相同的结果。我在Go操场(here)上尝试了该程序,并报告了死锁错误。我的Go环境有问题吗?
package main
import (
"fmt"
"testing"
)
func TestChan(t *testing.T) {
c := make(chan int)
c <- 1
fmt.Println(<-c)
}
如果您阅读了Go教程(https://tour.golang.org/concurrency/2),则会发现以下短语:
“默认情况下,发送和接收块,直到另一侧准备好为止。这允许goroutine在没有显式锁或条件变量的情况下进行同步。”
因此,您的发送(
您可以按照以下所示在goroutine中执行发送来解除阻止自己的权限:
package main
import (
"fmt"
)
func main() {
c := make(chan int)
go func(){c <- 1}()
fmt.Println(<-c)
}
您确实需要执行渠道管理(将其关闭)。