选择阻塞的呼叫和频道

我很确定我以前看过一个关于此的问题,但现在找不到。


本质上,我想select在一个被阻止的呼叫以及一个频道上。


我知道我可以将阻塞的调用推送到 goroutine 中并通过通道等待结果,但这感觉像是错误的解决方案。


有没有一种惯用的方式来写我缺少的这个?


最理想的情况是:


select {

case a <- c:

  ...

case ans := connection.Read():

  ...

}


素胚勾勒不出你
浏览 86回答 1
1回答

慕田峪9158850

如果你有一个你想要的通道和函数select,使用 goroutine 和通道是惯用的解决方案。请注意,如果从通道接收到值,则不会影响函数,它将继续运行。您可以使用context.Context它来表示不再需要它的结果,并且它可能会提前终止。如果您被允许重构,您可以“使”函数在同一通道上发送,因此您只需要从单个通道接收。另一个重构想法是让函数监视相同的通道并提前返回,所以你可以只做一个没有select.请注意,如果您需要在许多地方执行此操作,您可以创建一个辅助函数来异步启动它:func launch(f func()) <-chan struct{} {&nbsp; &nbsp; done := make(chan struct{})&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; defer close(done)&nbsp; &nbsp; &nbsp; &nbsp; f()&nbsp; &nbsp; }()&nbsp; &nbsp; return done}示例函数:func test() {&nbsp; &nbsp; time.Sleep(time.Second)}然后使用它:select {case a := <-c:&nbsp; &nbsp; fmt.Println("received from channel:", a)case <-launch(test):&nbsp; &nbsp; fmt.Println("test() finished")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go