关于频道的一些问题

时间:2014-10-10 09:36:29

标签: go rabbitmq

1 - 让陈破坏的条件是什么?

deliveries <-chan amqp.Delivery
for d:= range deliveries{
    ..
}

如果几分钟内没有更多的数据传递,它就会中断。   代码是否与下面相同?

deliveries <- chan amqp.Delivery
for{
    d,ok:=<-deliveries
    if !ok{
        break
    }
    //code
}

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

3 - chan如何实现?“ok”是关于客户端的状态,为什么它会返回“ok”?

2 个答案:

答案 0 :(得分:0)

1)代码1和2不同:第二个也提取ok,表示发送方是否关闭了该频道。这使您的代码更加健壮。

2)频道只能传输一种类型的消息。如果您需要状态代码,请将其放在消息中。

答案 1 :(得分:0)

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

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

receive表达式中的第二个结果是bool,指示操作是否成功。如果收到发送的值,则第二个结果为true;如果因为通道已关闭而收到零值,则返回false。

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

以下循环非常相似。它们都会在通道关闭之前接收值。

for v := range c {
     // code
}

for {
    v, ok := <-c
    if != ok {
        break
    }
    // code
}

这些循环之间的主要区别在于变量v的范围。 v的范围在第一个循环之外,在第二个循环之内。如果你use a closure and goroutine in the loop,这种区别很重要。