go中关于channel的一些问题

1-make chan破的条件是什么?


deliveries <-chan amqp.Delivery

for d:= range deliveries{

    ..

}

如果大约几分钟 chan 交付中没有更多数据,它将中断。上面的代码和下面的一样吗?


deliveries <- chan amqp.Delivery

for{

    d,ok:=<-deliveries

    if !ok{

        break

    }

    //code

}

2-为什么chan不仅返回数据还返回状态?“ok”是什么意思?


3-chan是怎么实现的?“ok”是client的状态,为什么会返回“ok”?


PIPIONE
浏览 216回答 2
2回答

烙印99

我将首先回答问题 2 和 3,因为答案为我对问题 1 的回答提供了上下文。2, 3) 内置函数close(c)记录不再有值被发送到通道 c。接收表达式中的第二个结果是一个布尔值,指示操作是否成功。如果接收到发送的值,则第二个结果为真,如果由于通道关闭而接收到零值,则为假。1) 通道上的范围接收通道上发送的值,直到通道关闭。以下循环非常相似。它们都接收值,直到通道关闭。for v := range c {&nbsp; &nbsp; &nbsp;// code}for {&nbsp; &nbsp; v, ok := <-c&nbsp; &nbsp; if != ok {&nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; }&nbsp; &nbsp; // code}这些循环之间的主要区别在于变量的范围v。的范围v在第一个循环之外和第二个循环内。如果您在循环中使用闭包和 goroutine,这种区别很重要。

慕姐4208626

1) 代码 1 和 2 不同:第二个也获取ok指示通道是否被发送方关闭的信息。这使您的代码更加健壮。2) 通道只能传输一种类型的消息。如果您需要状态代码,则必须将其放入消息中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go