为了账号安全,请及时绑定邮箱和手机立即绑定

Golang:我可以转换为 chan 接口{}

Golang:我可以转换为 chan 接口{}

Go
holdtom 2021-08-16 15:17:39
我正在尝试为订阅编写一个通用包装器,例如:type Subscriber interface{    Subscribe(addr string) chan interface{}}假设有一个我想使用的库,它有一个 subscribe 方法,但它使用chan library.Object. 我希望能够执行以下操作:func (s *mySubscriber) Subscribe(addr string) chan interface{}{    ch := make(chan library.Object)    library.Subscribe(addr, ch)    return chan interface{}(ch)}目前,我不相信这样的演员阵容是可能的。而且我不想修改底层库,因为包装器应该与库实现无关。我已经看到有没有办法将结构转换为通过通道发送,但在这种情况下,可以修改应用程序以满足需要。在这里,不能。这可能吗?有没有更好的办法?一种解决方案是将通用通道传入 Subscribe,并无限期地等待chan library.Object和触发通过我的通用通道的任何内容,但我并不特别喜欢为了绕过类型转换而必须引入另一个通道。
查看完整描述

2 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

对于偶然发现这个问题并想要一些内联代码的其他人:


// wrap a timeout channel in a generic interface channel

func makeDefaultTimeoutChan() <-chan interface{} {

  channel := make(chan interface{})

  go func() {

    <-time.After(30 * time.Second)

    channel <- struct{}{}

  }()

  return channel

}


// usage

func main() {

  resultChannel := doOtherThingReturningAsync()

  cancel := makeDefaultTimeoutChan()

  select {

    case <-cancel:

      fmt.Println("cancelled!")

    case results := <-resultChannel:

      fmt.Printf("got result: %#v\n", results)

  }

}


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 272 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信