题目描述
我在测试一段channel代码时跑出了一个和自己预期不一样的结果
题目来源及自己的思路
我试图测试make的第二个参数对读写channel的阻塞情况的影响
相关代码
package main
import (
"fmt"
"time"
)
func produce() <-chan int {
chs := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Printf("----%d\n", i)
chs <- i
}
close(chs)
}()
return chs
}
func consume(queue <-chan int) {
for d := range queue {
fmt.Println(d)
}
}
func main() {
ch := produce()
go consume(ch)
time.Sleep(3 * 1e9)
}
你期待的结果是什么?实际看到的错误信息又是什么?
我的预期是:size==0的时候,chs <- i后,channel的写入立刻阻塞,此时进去读,但是实际测试发现,第二次才阻塞(为什么这么判断请看下面的返回结果)
非预期返回结果:
----0
----1
0
1
----2
----3
2
3
----4
----5
4
5
----6
----7
6
7
----8
----9
8
9
预期返回结果:
----0
0
...........(省略下面的)
你这里,读跟写不一定哪个先发生。
如果读先发生(读会阻塞),那么第一次写就不会阻塞,第二次才阻塞。