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

go中关于channel的一些问题

go中关于channel的一些问题

Go
PIPIONE 2021-08-23 15:46:35
1-make chan破的条件是什么?deliveries <-chan amqp.Deliveryfor d:= range deliveries{    ..}如果大约几分钟 chan 交付中没有更多数据,它将中断。上面的代码和下面的一样吗?deliveries <- chan amqp.Deliveryfor{    d,ok:=<-deliveries    if !ok{        break    }    //code}2-为什么chan不仅返回数据还返回状态?“ok”是什么意思?3-chan是怎么实现的?“ok”是client的状态,为什么会返回“ok”?
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

我将首先回答问题 2 和 3,因为答案为我对问题 1 的回答提供了上下文。


2, 3) 内置函数close(c)记录不再有值被发送到通道 c。


接收表达式中的第二个结果是一个布尔值,指示操作是否成功。如果接收到发送的值,则第二个结果为真,如果由于通道关闭而接收到零值,则为假。


1) 通道上的范围接收通道上发送的值,直到通道关闭。


以下循环非常相似。它们都接收值,直到通道关闭。


for v := range c {

     // code

}


for {

    v, ok := <-c

    if != ok {

        break

    }

    // code

}

这些循环之间的主要区别在于变量的范围v。的范围v在第一个循环之外和第二个循环内。如果您在循环中使用闭包和 goroutine,这种区别很重要。


查看完整回答
反对 回复 2021-08-23
?
慕姐4208626

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

1) 代码 1 和 2 不同:第二个也获取ok指示通道是否被发送方关闭的信息。这使您的代码更加健壮。

2) 通道只能传输一种类型的消息。如果您需要状态代码,则必须将其放入消息中。


查看完整回答
反对 回复 2021-08-23
  • 2 回答
  • 0 关注
  • 215 浏览
慕课专栏
更多

添加回答

举报

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