关于golang的channel中的一个疑问

题目描述

我在测试一段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
...........(省略下面的)

阅读 1.7k
1 个回答

你这里,读跟写不一定哪个先发生。

如果读先发生(读会阻塞),那么第一次写就不会阻塞,第二次才阻塞。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题