Go 当您向频道发送消息并关闭它时,是否存在数据竞争?

Go 当您向频道发送消息并关闭它时,是否存在数据竞争?,go,channel,goroutine,Go,Channel,Goroutine,我遇到了一场数据竞赛,就像这样 WARNING: DATA RACE 11652 Read by goroutine 14: 11653 runtime.chansend() 11654 /usr/local/go/src/pkg/runtime/chan.c:155 +0x0 ... 11657 11658 Previous write by goroutine 13: 11659 runtime.closechan() 11660 /u

我遇到了一场数据竞赛,就像这样

WARNING: DATA RACE
11652 Read by goroutine 14:
11653   runtime.chansend()
11654       /usr/local/go/src/pkg/runtime/chan.c:155 +0x0
            ...
11657
11658 Previous write by goroutine 13:
11659   runtime.closechan()
11660       /usr/local/go/src/pkg/runtime/chan.c:1232 +0x0
            ...

通道有锁,为什么会有数据竞争?

通道关闭后正在写入。即使只有一个goroutine,你也会看到恐慌

package main

func main() {
    c := make(chan struct{})
    close(c)
    c <- struct{}{}  // should panic!
}
主程序包
func main(){
c:=make(chan结构{})
关闭(c)

c我看到两个不同的例程,一个正在发送,一个正在关闭。最明显的是数据竞争。你说通道有锁是什么意思?你能显示相关的代码吗?使用同一通道的不同goroutine不应该有数据竞争。通道在其实现中有锁。你需要提供更多的代码。请提供导致数据竞争。没有代码就很难回答有关代码的问题。当单一goroutine场景不会引起恐慌时,可能会发生这种数据竞争。