channel的循环

king54346 · 2021-09-17 11:19:23 · 1472 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-09-17 11:19:23 的主题,其中的信息可能已经有所发展或是发生改变。

微信图片_20210917111826.png 求大佬解释为什么无法执行啊


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1472 次点击  
加入收藏 微博
6 回复  |  直到 2021-10-11 09:12:59
fengCCer
fengCCer · #1 · 4年之前

看看这样能不能实现你的想法,这是单向通道的东西

func test1(ch chan<- int) {
    for i := 1; i <= 5; i++ {
        ch <- i
    }
    close(ch)
}

func test2(ch chan<- int, ch1 <-chan int) {
    for v := range ch1 {
        ch <- v
    }
    close(ch)
}

func test3(ch <-chan int) {
    for v := range ch {
        fmt.Println(v)
    }
}

func main() {
    ch1 := make(chan int)
    ch2 := make(chan int)
    go test1(ch1)
    go test2(ch2, ch1)
    test3(ch2)
}
zhang-jianqiang
zhang-jianqiang · #2 · 4年之前

channel的读取必须成对出现

zzustu
zzustu · #3 · 4年之前

channel的读取必须成对出现

不是必须成对出现的,chan 的写入读取可以当成生产消费来理解, 当生产者生产的数据总量不会超过chan的缓冲区,可以不需要消费者

jinl80
jinl80 · #4 · 4年之前

ints 是无缓冲通道, 协程A会阻塞在 X <- i +1,。 要么一个协程写,一个协程读;要么改成有缓冲通道

zhang-jianqiang
zhang-jianqiang · #5 · 4年之前
zzustuzzustu #3 回复

#2楼 @zhang-jianqiang 不是必须成对出现的,`chan` 的写入读取可以当成生产消费来理解, 当生产者生产的数据总量不会超过`chan`的缓冲区,可以不需要消费者

对,你说得这些基础知识完全正确

yudotyang
yudotyang · #6 · 3年之前

这个是跟无缓冲通道有关系的。在无缓冲通道中,是不能自己生产,自己消费的。因为在无缓冲通道中,有一个生产者发送消息,则需要找到一个消费者消费,这样才能可以。可以将通道更改成缓冲通道就可以了。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传