go - 关于 channel in go 的一些问题

标签 go rabbitmq

1-让chan break的条件是什么?

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

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

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

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

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

最佳答案

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

2, 3) 内置函数 close(c)记录没有更多的值将被发送到 channel c。

receive 中的第二个结果expression 是一个 bool 值,指示操作是否成功。如果收到发送的值,则第二个结果为真;如果因为 channel 关闭而收到零值,则第二个结果为假。

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

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

for v := range c {
     // code
}

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

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

关于go - 关于 channel in go 的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296303/

相关文章:

http - Go Golang 提供特定的 html 文件

forms - 使用 golang http 库提交表单

ssl - 尝试使用 OpenSSL 连接到 RabbitMQ 时连接无限挂起 - 未提及错误

java - 与 Rabbitmq 建立连接的问题

java - RabbitMQ 消息过期通知

macos - RabbitMQ Go 教程日志.Printf 无法写入磁盘文件?

json - 如何使用 MarshalJSON 将结构转换为具有自定义字段类型的公共(public)结构

recursion - Golang File/Directory Walker 多次添加文件

go - 是否在匿名结构中导出字段有什么区别吗?

kubernetes - Kubernetes RabbitMQ队列镜像