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的一个bug。
这样也会报错
complete <- "aaa1"
msg := <-complete
fmt.Println(msg)
complete <- "aaa2"
msg = <-complete
fmt.Println(msg)
理论分析,不应该出现错误的。
同一个协程,先写再读,不应该报错的。
但是,实际运行,确实报这个错误。
难道channel必须在不同协程之间读写?
但是,channel加上缓冲区,var complete chan string = make(chan string,1),就不报错了。
似乎不带缓冲区的channel只支持不同协程之间读写?
期待高手来解答。
#5