gpt4 book ai didi

go - 不能在返回参数中使用 msgs (type <-chan _) 作为 chan _ 类型

转载 作者:IT王子 更新时间:2023-10-29 01:57:27 26 4
gpt4 key购买 nike

有如下代码:

func consumeQueue(ch *amqp.Channel, q_Name string) (chan amqp.Delivery) {
msgs, err := ch.Consume(
q_Name, // queue
"", // consumer
true, // auto-ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
failOnError(err, "Failed to register a consumer")
return msgs
}

它抛出以下编译时异常:

cannot use msgs (type <-chan amqp.Delivery) as type chan amqp.Delivery in return argument

怎么了?

最佳答案

它非常简单。您正在尝试返回一个定向 channel (在本例中为只读 channel )作为可用于读取和写入的通用 channel 。

关于 channel 方向的一些基本信息here

Tl;博士

任何chan t可以用作定向 channel 。这提高了整体类型安全性,并使代码更易于他人理解/使用:

func Foo() <-chan struct{} {
}

这告诉我 Foo返回一个我可以阅读的 channel 。如果它只返回 chan struct{} ,我必须检查文档以查看我是否应该将某些内容推送到该 channel 或从该 channel 接收内容。

可以将非定向 channel 设置为定向 channel ,但出于显而易见的原因不允许转换回非定向 channel 。你可以查看the spec有关 channel 类型的更多详细信息,但其本质是这个简单的句子:

The optional <- operator specifies the channel direction, send or receive. If no direction is given, the channel is bidirectional. A channel may be constrained only to send or only to receive by conversion or assignment.

解决方案

在您的特定情况下,解决方案很简单:更改返回类型以匹配您拥有的 channel :

func consumeQueue(ch *amqp.Channel, q_Name string) (<-chan amqp.Delivery) {

正如您所注意到的:当您尝试将定向 channel 转换为双向 channel 时,编译器会对您大喊大叫。当您尝试将读取 channel 转换为写入 channel (写为 chan<- amqp.Delivery )时,您也会遇到类似的错误。因此,如果您从编译器收到类型错误消息,只需检查它提到的类型......go 的编译器会吐出非常不言自明的错误 IMO

关于go - 不能在返回参数中使用 msgs (type <-chan _) 作为 chan _ 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47510854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com