使用多个goroutine写入同一通道

使用多个goroutine写入同一通道,go,channels,Go,Channels,这段代码工作正常,我的问题是为什么。我了解到,在一个无缓冲通道被阻塞之前,您只能向其发送一个值。但是在我的代码中,我写了两次,但是来自不同的go例程,并且它工作正常。如果有人能向我解释原因,我将不胜感激 func main(){ var ch chan string =make(chan string) go write(ch) go write2(ch) go read(ch) select{} } func write(ch chan

这段代码工作正常,我的问题是为什么。我了解到,在一个无缓冲通道被阻塞之前,您只能向其发送一个值。但是在我的代码中,我写了两次,但是来自不同的go例程,并且它工作正常。如果有人能向我解释原因,我将不胜感激

func main(){
    var ch chan string =make(chan string)
     go write(ch)
     go write2(ch)
     go read(ch)
        select{}
}

func write(ch chan string){
    for{
        ch<-"write1"
    }
}

func write2(ch chan string){
    for{
        ch<-"write2"
    }
}

func read(ch chan string){
    for{    
        time.Sleep(time.Second)
        select{
            case res:= <-ch: fmt.Println(res)
            case <-time.After(time.Millisecond*200): fmt.Println("time out")
        }
    }
}
func main(){
变量ch chan string=make(chan string)
去写(ch)
写入2(ch)
阅读(ch)
选择{}
}
func写入(ch chan字符串){
为了{

ch您可以再次写入它,因为您是从它读取的。在读取操作之后,可能会发生另一次写入。goroutine从哪个执行写入或读取操作并不重要


页面对此进行了解释。

谢谢。因此,当“写入”已写入ch时,“write2”将等待/阻止,直到我的“读取”函数从“写入”接收到值?是的,没错。这种方式可以使用通道同步执行,而不仅仅是传递数据。谢谢,伙计!非常感谢您抽出时间!