我是一个golang初学者,在学习频道和日常工作时遇到了一些麻烦。我的一个卡住点是golang通道阻止机制是如何工作的。在golang tour中,它说我用我的理解做了一些实验,并达到了结果,.这些提示并没有真正让我对错误是如何发生的了解。我用谷歌搜索过它,但我得到的几乎每篇文章都是关于渠道的深层机制,或者它假设读者理解了单个单词已经给出了所有的信息。By default, sends and receives block until the other side is ready.
fatal error: all goroutines are asleep - deadlock!
block
但作为一个初学者,我有很多疑问,比如:
同一 go-routine 能否在写入通道后执行通道读取操作?
如果某个通道被阻塞,其他 go-routine 还能向它发送消息吗?
如果 go-routine 尝试将消息发送到被阻止的通道,会发生什么情况?它会通过错误,还是什么也没发生,或者?
以下是我的一个让我感到困惑的测试?(据我所知,main func是一个go-routine,我认为它的执行是相同的)
package main
import "time"
func chanWrite(s string, ch chan string) {
ch <- s
println("write", s)
}
func chanRead(ch chan string) {
println("read", <- ch)
}
// main func 1
func main() {
ch := make(chan string)
go chanWrite("A", ch)
time.Sleep(time.Second)
}
// main func 1 didn't throw error
// main func 2(modify main func 1 and then execute it)
func main() {
ch := make(chan string)
chanWrite("A", ch)
time.Sleep(time.Second)
}
// main func 2 throw error: "fatal error: all goroutines are asleep - deadlock!"
我在这个测试中看到的是在某些情况下,当我在没有阅读的情况下将内容写入通道时,我得到了,有时什么也没发生(例如在main func 1中)。fatal error
那么,有人可以以一种简单而深入的方式解释通道块是如何工作的,以便golang初学者可以轻松理解它吗?
慕的地6264312
撒科打诨
相关分类