使用受阻止的通道进行测试,不会报告死锁

问题描述 投票:0回答:1

使用渠道进行测试时遇到了一个问题。

在正常的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 testing channel
1个回答
0
投票

如果您阅读了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)
}

您确实需要执行渠道管理(将其关闭)。

© www.soinside.com 2019 - 2024. All rights reserved.