2014-10-10 48 views
-1

1 - 使chan中断的条件是什么?有关渠道进入的一些问题

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

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

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

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

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

回答

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

+0

即使在关闭的情况下,我几乎在每种情况下都会推荐第一个(一行代码)在第二个(四行代码)之上。你总是可以将'v'作为参数传入你的goroutine(或者如果需要的话重新声明它)。更多的行==更多的错误。例如第二种形式的代码不能编译。 – Dustin 2014-10-13 17:13:51

0

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

2)通道只能传输一种类型的消息。如果你需要状态码,你可以把它放在信息里面。

+0

如果排除鲁棒性,代码1和2是否相同?代码1是否死循环? – 2014-10-10 09:46:11

+1

使用for/select代替频道范围绝对不*使您的代码更健壮,不应该完成。通道关闭后,循环将终止。编写更多的代码只是为bug引入更多的机会。 – Dustin 2014-10-13 17:08:49