【问题标题】:cannot use msgs (type <-chan _) as type chan _ in return argument不能在返回参数中使用 msgs (type <-chan _) 作为类型 chan _
【发布时间】:2018-05-10 16:29:23
【问题描述】:

有以下代码:

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

怎么了?

【问题讨论】:

    标签: go types channel


    【解决方案1】:

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

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

    Tl;博士

    任何chan t 都可以用作定向通道。这增加了整体的类型安全性,并使代码更容易被他人理解/使用:

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

    这告诉我Foo 返回一个我可以读取的频道。如果它只返回chan struct{},我必须检查文档,看看我是否应该将某些东西推送到那个频道,或者从它那里接收。

    可以将非定向通道设为定向,但由于显而易见的原因,不允许将其转换回无定向通道。更多详情可以查看the spec 频道类型,但它的精髓就是这么简单的一句话:

    可选的

    解决方案

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-31
      • 2013-09-19
      • 2021-11-16
      • 2015-11-02
      • 2015-03-03
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      相关资源
      最近更新 更多