tar*_*lah 1 concurrency channel go
引用Go 编程语言规范:
“选择”语句选择将进行一组可能的通信中的哪一个。它看起来类似于“switch”语句,但所有情况都涉及通信操作。
如何在一个case子句中等待多个通道,以便仅当两个通道都返回时才执行案例?
例子:
select {
case <-ch1, <-ch2 ... : //wait for ch1 and ch2
// do something
case ..
}
Run Code Online (Sandbox Code Playgroud)
没有办法在同一个选择案例中等待多个通道,也没有办法在选择案例中“失败”,如文档所述:
不过,您可以通过其他方式轻松执行此类操作。
没有选择:
这仅在 c2 可用的情况下保证 c1 返回时才有效。
v1 := <-c1
v2 := <-c2
Run Code Online (Sandbox Code Playgroud)
带循环:
尽管有顺序,这仍然有效,但 c1 和 c2 只能触发一次,否则可能会出现异常:
var v1, v2 int
for i := 0; i < 2; i++ {
select {
case v1 = <-c1:
case v2 = <-c2:
}
}
// both v1 and v2 are set here
Run Code Online (Sandbox Code Playgroud)
使用 goroutine:
这两种方式都有效,但您会丢失结果的顺序:
c3 := make(chan int, 2)
go func() { c3 <- (<-c1) }()
go func() { c3 <- (<-c2) }()
first := <-c3
second := <-c3
Run Code Online (Sandbox Code Playgroud)
使用 sync.WaitGroup:
这两种方式都有效:
var wg sync.WaitGroup
var v1, v2 int
wg.Add(2)
go func() {
v1 = <-c1
wg.Done()
}()
go func() {
v2 = <-c2
wg.Done()
}()
wg.Wait()
// v1 and v2 are both set
Run Code Online (Sandbox Code Playgroud)
等等。当然还有其他方法。最好的方法取决于您要实现的目标的细节。
| 归档时间: |
|
| 查看次数: |
337 次 |
| 最近记录: |