为了账号安全,请及时绑定邮箱和手机立即绑定

添加元素后通道长度为零

添加元素后通道长度为零

Go
ibeautiful 2023-07-26 13:33:29
我学习了 Go 中的缓冲通道,但有些魔法对我来说是隐藏的。我有这个代码package mainimport (    "fmt")func write(ch chan int) {    for i := 1; i <= 5; i++ {        ch <- i        fmt.Printf("Channel's length is %d\n", len(ch))    }    close(ch)}func main() {    ch := make(chan int, 2)    go write(ch)    for v := range ch {        fmt.Println(v)    }}输出是Channel's length is 0Channel's length is 1Channel's length is 21234Channel's length is 2Channel's length is 05为什么 write goroutine 中第一次迭代的通道长度为零?我不知道什么?
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

根据 GO 缓冲区的概念,您可以根据定义的缓冲区大小将元素推送到通道中(在您的情况下为 2)。但当一个元素被推入通道时,主 GO 例程正在读取相同的元素,这导致通道大小减小到零。因此,如果您在读取语句之前花一些时间。睡眠,您将得到预期的结果。


`


package main

import (

    "fmt"

    "time"

)


func write(ch chan int) {

    for i := 1; i <= 5; i++ {

        ch <- i

        fmt.Printf("Channel's length is %d\n", len(ch))

    }

    close(ch)

}

func main() {

    ch := make(chan int, 2)

    go write(ch)

    time.Sleep(2*time.Second)

    for v := range ch {

        fmt.Println(v)

        time.Sleep(2*time.Second)

    }

}`

上述代码的输出是:


通道长度为1


通道长度为2


1


通道长度为2


2


通道长度为2


3


通道长度为2


4


5


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信