Go 关于关键词的比较;围棋;在戈罗廷没有

Go 关于关键词的比较;围棋;在戈罗廷没有,go,channel,goroutine,Go,Channel,Goroutine,以下代码记录了一个错误: 致命错误:所有goroutine都处于休眠状态-死锁 主程序包 输入“fmt” func main(){ ch:=制造(成交量) ch死锁发生的原因: 在第一个代码段中,您只有一个主goroutine,当您试图在此处写入通道时,它被阻止: ch <- 1 从 仅当缓冲区已满时才发送到缓冲通道块 因此,您可以写入通道,直到缓冲区已满。然后必须有人开始从通道读取 选项2:从goroutine写入通道,就像您在第二个代码段中所做的那样: func assign(ch

以下代码记录了一个错误:

致命错误:所有goroutine都处于休眠状态-死锁

主程序包
输入“fmt”
func main(){
ch:=制造(成交量)

ch死锁发生的原因:

在第一个代码段中,您只有一个主goroutine,当您试图在此处写入通道时,它被阻止:

ch <- 1

仅当缓冲区已满时才发送到缓冲通道块

因此,您可以写入通道,直到缓冲区已满。然后必须有人开始从通道读取

选项2:从goroutine写入通道,就像您在第二个代码段中所做的那样:

func assign(ch chan int) {
    ch <- 1
}

func main() {
    ch := make(chan int)
    go assign(ch) // does not block the main goroutine
    fmt.Println(<-ch) // waiting to read from the channel
}
func赋值(ch chan int){

ch当您使用无缓冲通道时,goroutine在写入期间被阻止,直到有人执行读取。 在您的第一个代码片段中,有一个无缓冲通道和一个goroutine(主goroutine)。 因此,当你试图写作时:

ch <- 1
使用缓冲通道(第三个代码段)时,可以在不阻塞goroutine的情况下执行
N
写入操作(其中
N
是缓冲区的大小)。
这就是为什么在您的示例中,您在没有阻塞的情况下进行了2次写入,并且以后可以读取它们。但是,如果您的缓冲区小于写入操作的计数,并且没有人执行读取操作,则您将陷入相同的阻塞问题(请参阅1和2个代码段的说明)。

再次感谢!可以将其解释为“发送和接收数据块,直到另一端准备就绪”?
ch <- 1
ch := make(chan int, 1) // buffer length is set to 1
func assign(ch chan int) {
    ch <- 1
}

func main() {
    ch := make(chan int)
    go assign(ch) // does not block the main goroutine
    fmt.Println(<-ch) // waiting to read from the channel
}
ch <- 1
fmt.Println(<-ch)
package main

import "fmt"

func print(ch chan int) {
    fmt.Println(<-ch)
}

func main() {
    ch := make(chan int)
    go print(ch)
    ch <- 1
}