go select 异步回调
时间: 2023-10-16 14:29:11 浏览: 54
在 Go 中,可以使用 select 语句实现异步回调。select 语句用于从多个通道中选择数据,如果其中某一个通道有数据可读,则 select 语句会从该通道读取数据并执行相应的操作。如果多个通道都有数据可读,则 select 会随机选择一个通道来读取数据。
下面是一个示例代码,其中使用 select 实现了异步回调:
```
package main
import (
"fmt"
"time"
)
func main() {
c1 := make(chan string)
c2 := make(chan string)
go func() {
time.Sleep(2 * time.Second)
c1 <- "result 1"
}()
go func() {
time.Sleep(1 * time.Second)
c2 <- "result 2"
}()
for i := 0; i < 2; i++ {
select {
case res := <-c1:
fmt.Println(res)
case res := <-c2:
fmt.Println(res)
}
}
}
```
在上面的代码中,我们创建了两个通道 c1 和 c2,并分别在它们的 Goroutine 中睡眠不同的时间后向通道写入数据。在主 Goroutine 中,我们使用 select 语句从这两个通道中选择数据,实现了异步回调的效果。输出结果为:
```
result 2
result 1
```
你可以看到,由于 c2 中的数据先被写入,因此先输出 c2 的结果,而 c1 的结果稍后输出。这就是 select 随机选择通道的效果。
需要注意的是,select 语句必须在一个无限循环中才能实现异步回调的效果。在上面的代码中,我们使用了 for 循环来保持 select 语句的运行。