【问题标题】:some questions about channel in go关于 go 频道的一些问题
【发布时间】:2014-10-10 09:36:29
【问题描述】:

1-使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"?

【问题讨论】:

    标签: go rabbitmq


    【解决方案1】:

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

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

    receive 表达式中的第二个结果是一个布尔值,指示操作是否成功。如果接收到发送的值,则第二个结果为 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,这种区别很重要。

    【讨论】:

    • 即使在闭包的情况下,在几乎所有情况下,我都会推荐第一个(一行代码)而不是第二个(四行代码)。您始终可以将 v 作为参数传递到您的 goroutine 中(或在必要时重新声明它)。更多行 == 更多错误。例如第二种形式的代码无法编译。
    【解决方案2】:

    1) 代码 1 和 2 不同:第二个代码还获取 ok,它表示通道是否被发送者关闭。这使您的代码更加健壮。

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

    【讨论】:

    • 如果排除鲁棒,代码 1 和 2 是否相同?代码 1 是死循环吗?
    • 对频道使用 for/select 而不是 range 绝对不会不会让您的代码更加健壮,因此不应该这样做。通道关闭后循环将终止。为此编写更多代码只会带来更多的错误机会。
    猜你喜欢
    • 2013-12-05
    • 2020-02-02
    • 1970-01-01
    • 2018-05-24
    • 2013-07-07
    • 2013-05-10
    • 2012-03-18
    • 2023-03-09
    • 2021-07-01
    相关资源
    最近更新 更多