当前位置: 首页 > 面试题库 >

Golang:我可以投射到chan界面{}

龚钧
2023-03-14
问题内容

我正在尝试为订阅编写通用包装,例如:

type Subscriber interface{
    Subscribe(addr string) chan interface{}
}

假设有一个我想使用的库,其中包含一个subscription方法,但是使用了一个库chan library.Object。我希望能够执行以下操作:

func (s *mySubscriber) Subscribe(addr string) chan interface{}{
    ch := make(chan library.Object)
    library.Subscribe(addr, ch)
    return chan interface{}(ch)
}

目前,我认为这样的转换是不可能的。而且我不想修改基础库,因为包装器应该与库实现无关。

我已经看到有没有一种方法可以投射Structs以便通过通道发送,但是在那种情况下,可以根据需要修改应用程序。在这里,它不能。这可能吗?有没有更好的办法?

一种解决方案是将通用通道传递到Subscribe中,然后无限期地等待chan library.Object并触发通用通道中发生的任何事情,但是我并不特别喜欢为了引入类型转换而不得不引入另一个通道。


问题答案:

不,您不能仅使用演员表就可以做到这一点。您已经考虑过,必须使用额外的渠道。幸运的是,已经有一个用于此的帮助程序库(免责声明:我已经写过)。您需要该Wrap功能。

  • 文档:https : //godoc.org/github.com/eapache/channels#Wrap
  • 代码:https://github.com/eapache/channels/


 类似资料:
  • 问题内容: 是否可以让函数具有以下接口: 如果我希望它在接口中使用function : 换句话说,我可以以某种方式转换为吗?或者我必须在使用的所有函数中都具有结果类型? 目前,我尝试了以下方法: 完整代码: 操场 问题答案: A 是值的通道,它不是单个值,而是值的来源(或目标),但在您的情况下,您将其用作来源。 因此,您不能转换为。您可以做的并且可能是您的意思是使用从a接收的值(类型)作为值。 这

  • 问题内容: 我正在写游戏。在C ++中,我会将所有实体类存储在BaseEntity类的数组中。如果一个实体需要在世界范围内移动,它将是一个PhysEntity,它是从BaseEntity派生而来的,但具有附加的方法。我试图模仿这是去: 这将无法编译,因为它无法告知“实体”是PhysEntity。什么是该方法的合适替代方法? 问题答案: 使用类型断言。例如,

  • 问题内容: 我想从数据库中获取价值,就我而言,我曾经从数据库中获取价值,但是却遇到了这个错误 这是我的代码 任何帮助将是荣幸:) @raffian,你的意思是这样吗? 问题答案: 问题是 这将返回一个 对象数组 列表 (Object []), 其中包含表中每一列的标量值。Hibernate将使用ResultSetMetadata推断返回的标量值的实际顺序和类型。 解 相关连结 使用迭代器

  • 问题内容: 我需要将jzy3d canvas强制转换为java.awt.component,我想使用JCombobox和按钮在框架中显示图表,但是当我要将画布强制转换为component时,程序被删除。谢谢您的回答。我已经尝试过了,对我没有帮助。 Launcher.java: ChartMode.java: 问题答案: 这为我工作。简单的解决方案,当我将jzy3d画布放到画布上并放入面板中时。

  • 问题内容: 我正在尝试在结构内使用slice chan类型,类似于下面的代码。但是,当我尝试接收 程序挂起。有没有办法做到这一点? 问题答案: goroutine中的第一行从通道接收,创建goroutine之后的main中的第一行也是如此。这意味着系统中仅有的两个goroutine都试图从slice通道接收,而没有人试图发送到其中。 更一般而言,问题是要使某人接收(消费),其他人必须同时发送(产生

  • 问题内容: 为什么在我的程序中触发java.lang.ClassCastException? java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为com.App.Equip] 该查询返回已回答(在CheckLists calsse中找到)但尚未由Equip对象回答的清单的列表 -这是代码: -我的java类: 我想将我的SQl查询的结果格式化