【问题标题】:Create a generic channel创建通用渠道
【发布时间】:2021-12-03 02:23:49
【问题描述】:

我的结构定义了一个映射通道的Subscribers

package ws

type SessionHandler struct {
    Subscribers      map[chan interface{}]bool
}

我想让任何类型的通道都可以实例化它,像这样:

type WsSession struct {
  handler *ws.SessionHandler
}

handler := &ws.SessionHandler{
    Subscribers:      make(map[chan WsResponse]bool),
}

我提供的代码示例不起作用 (cannot use make(map[chan WsResponse]bool) (value of type map[chan WsResponse]bool) as map[chan interface{}]bool value in struct literal),但我怎样才能将其更新到我的目的?

【问题讨论】:

  • chan interface{} 的类型正好是 chan interface{},仅此而已。如果您想要chan WsResponse,请改用该类型。
  • @Adrian 我说我想让它通用,对吧?这只是我如何使用它的一个示例,但我可以将 Subscribers 设置在一个位置,例如 WsResponse,然后设置在另一个位置,例如 AnyOtherKindOfStruct
  • SessionHandler 是做什么的,它需要一个频道类型但不关心它是什么类型?这似乎更像是一个潜在的设计问题。
  • interface{} 本身实际上是一个对象,它可以从一个对象隐式创建,但是接口通道与对象通道并不是一成不变的。这些是不同的类型。任何接口都不会出现在对象通道的另一端,反之亦然。
  • 您可以在upcoming Go 1.18 中使用类型参数,就像在其他各种语言中使用泛型或模板一样。

标签: go


【解决方案1】:

正如@torek 在我的问题中所评论的那样,我试图完成的事情将在Go v1.18 中实现。

现在,我最终做的是:

handler := &ws.SessionHandler{
    Subscribers:      make(map[chan json.RawMessage]bool),
}

我不再依赖 go 结构并在我的频道中与 json.RawMessage 通信。它并不完全干净,因为我需要编组/解组我的消息以给予适当的处理,但它是“通用的”,我可以完成我想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2012-11-02
    • 2018-11-17
    • 1970-01-01
    相关资源
    最近更新 更多