猿问

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

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


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和触发通过我的通用通道的任何内容,但我并不特别喜欢为了绕过类型转换而必须引入另一个通道。


holdtom
浏览 268回答 2
2回答

慕森卡

对于偶然发现这个问题并想要一些内联代码的其他人:// wrap a timeout channel in a generic interface channelfunc makeDefaultTimeoutChan() <-chan interface{} {&nbsp; channel := make(chan interface{})&nbsp; go func() {&nbsp; &nbsp; <-time.After(30 * time.Second)&nbsp; &nbsp; channel <- struct{}{}&nbsp; }()&nbsp; return channel}// usagefunc main() {&nbsp; resultChannel := doOtherThingReturningAsync()&nbsp; cancel := makeDefaultTimeoutChan()&nbsp; select {&nbsp; &nbsp; case <-cancel:&nbsp; &nbsp; &nbsp; fmt.Println("cancelled!")&nbsp; &nbsp; case results := <-resultChannel:&nbsp; &nbsp; &nbsp; fmt.Printf("got result: %#v\n", results)&nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答