【问题标题】:How to assign specific channel to empty interface channel如何将特定通道分配给空接口通道
【发布时间】:2020-07-22 15:35:32
【问题描述】:

如果我有一个空的接口通道类型,我只是想监视事件,并想根据需要为其分配特定的通道,这在 Golang 中是否可行?

myChan := make(chan interface{})
confirms := ch.NotifyPublish(make(chan amqp.Confirmation, 1))
myChan = confirms // (<- cannot use type chan Confirmation in type chan interface{} assignment

【问题讨论】:

  • 你没有泛型通道类型,因为 Go 目前没有泛型。 chan interface{}chan amqp.Confirmation 是不同的类型。
  • 但是空接口是泛型类型的近似值。如果我创建 chan interface{},我可以传输字符串、整数或其他类型,并使用开关来处理输出。如果通道可以以与类型无关的行为进行操作,那么似乎有一种方法可以创建一个与类型无关的通道并将其他通道分配给它。
  • Go 类型是不变的,所以如果你试图模糊地将接口定义为“泛型类型的近似”,chan Achan B 是不同的(可能不清楚, 但interface{} 在功能上与任何其他接口没有什么不同,它只是没有方法)。
  • 假设这段代码可以编译,你希望myChan &lt;- "foo" 怎么工作?特别是,确认的接收者会看到什么?

标签: go rabbitmq


【解决方案1】:

您可以将通道本身作为一个空接口传递,然后在另一端解析它。

confirms := ch.NotifyPublish(make(chan amqp.Confirmation, 1))
var mychanpointerpointer interface{}
mychanpointerpointer = confirms
.
.
.
switch mychanpointer := mychanpointerpointer.(type) {
case chan amqp.Confirmation:
    fmt.Println("GOT A CONFIRMATION CHANNEL:", mychanpointer)
}

输出:GOT A CONFIRMATION CHANNEL: 0xc42016a000

【讨论】:

  • 这实际上不是一个“聊天室”:StackOverflow 上的问题和答案应该永久保存(或至少几十年),以制作社区构建的常见问题解答等。所以这里的措辞真的很重要。泛型和接口是不同的:参见,例如,this question。 (我并没有对自己投反对票,但如果你更新你的 Q-and-self-A 以使用正确的词语,那可能会有所帮助......)
  • @ArloGuthrie,从我的立场来看,这里的go 社区似乎并不痴迷于回答如果发帖人至少阅读了官方常见问题解答可能不应该被问到的问题,并且可能成为有关此事的几个入门级文档。所以,是的,存在一定的冲向 SO 而不是阅读文档的文化,以及回答此类问题以获得业力的文化(或 SO 用语中所说的任何数字)。阅读go 标签的人似乎不属于喜欢这两种文化的人群。
  • @ArloGuthrie,为了更好地强调我的意思,我曾经开玩笑地回答了一个问题“如何在 Git 中记录前 N 次提交?”,但现在它是我所有答案中投票率最高的答案放弃了。这就是一个问题的答案,可以通过查看git log --help 的输出来回答,我不知道,十五秒。我的意思是,不愿意自己研究的病态文化被另一种通过回答这些问题来增加业力的文化所强化。你可以看到在我们的例子中适得其反——只是有点意想不到的形式可能是;-)
  • @Kostix 当我应该询问如何传递通道并使用空接口/开关/反射对其进行一般处理时,我询问了如何传递泛型类型通道。我想有些人看到“通用”这个词就放弃了阅读。 :D
猜你喜欢
  • 2016-06-09
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 2012-12-14
  • 2011-02-22
  • 1970-01-01
  • 2017-07-30
  • 2014-05-02
相关资源
最近更新 更多