package main
import (
"fmt"
)
var complete chan string = make(chan string)
func printstring(i int) {
fmt.Println("打印这里", i)
complete <- "妥了"
}
func main() {
go printstring(1)
msg := <-complete
fmt.Println(msg)
printstring(2)
}
已经有一写一读,为什么还会死锁?怎么样才能不死锁呢?
第 1 条附言 ·
上面的兄弟说无缓冲区有写入必须有读取这个意思的,那要是我只在main中执行:go printstring(1) time.Sleep(3 * time.Second) 这样还是正常执行的 又怎么理解?
第 2 条附言 ·
看了下面的分析感觉快理解了,再多测试几下发现又蒙蔽了
这个看你怎么理解了。
所以我说的是似乎,并没有说就是。
按照正常的理解,既然是一个通道,当然是发送接收而已,没那么多复杂的。同一个协程,我发了再收,应该也说得通,逻辑不矛盾。但是实际就是不行,和常规理解不同。
你当然可以说GO就是这样规定的,必须一个协程发,另一个协程收,没毛病。但这确实是不大合乎常规的理解。并且,显然,这里看出,带缓冲区和不带缓冲区,都是通道,存在一个很大区别。不注意,很可能犯这个错误。
所以,这个例子看出,尽量用带缓冲区的channel,哪怕是长度是1的缓冲区,也更不容易出错。按照常规理解,长度是1的缓冲区,就是一次只能发一个,实际就是和不带缓冲区的意思一样,当然这个是常规理解。但GO就是不按常规理解来,这个也不是GO的错。但这样,似乎欠缺点什么,至少不够友好。
#11