老师,你好!关于channel的基本用法,我有一个疑问,希望你能帮我解答。
下面是我的代码(我的go版本是1.13.4)
package main
func main() {
ch := make(chan string, 3) // 创建缓冲区为3 的 通道
ch <- "a" // 标注1 main goroutine 向 通道ch 发送 "a"
ch <- "b" // 标注2 main goroutine 向 通道ch 发送 "b"
ch <- "c" // 标注3 main goroutine 向 通道ch 发送 "c"
<- ch // 标注4 请问,接收 通道ch 数据 的是哪个goroutine
ch <- "d" // 标注5 main goroutine 向 通道ch 发送 "d"
}
假如main函数中注释/删除掉[标注4]行的代码,会报“ deadlock!”错误。这个我理解,因为超过了缓冲区大小。
但是,在标注3和标注5之间加入标注4的代码,就不会报错。
我的疑问是:
channel不是在不同的goroutine之间进行通信吗?
main goroutine 向 通道ch 发送 “a”、“b”、“c”、“d”
请问,接收(<- ch)的goroutine是哪个?