golang select 异步操作
时间: 2023-09-01 07:10:48 浏览: 192
在 Go 语言中,可以使用 `select` 语句实现异步操作。`select` 语句用于在多个通信操作中选择一个进行处理,它会阻塞直到其中一个通信操作可以继续执行。
下面是一个简单的例子,使用 `select` 语句实现异步读取和写入操作:
```go
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go func() {
time.Sleep(time.Second)
ch <- 1
}()
select {
case <-ch:
fmt.Println("Read from channel")
case <-time.After(2 * time.Second):
fmt.Println("Timeout")
}
go func() {
time.Sleep(time.Second)
ch <- 2
}()
select {
case ch <- 3:
fmt.Println("Write to channel")
case <-time.After(2 * time.Second):
fmt.Println("Timeout")
}
}
```
在这个例子中,我们创建了一个整型的通道 `ch`,然后启动了两个 goroutine,一个向通道中写入数据,另一个从通道中读取数据。使用 `select` 语句可以同时处理这两个异步操作,其中一个操作完成后就会立即执行对应的代码块。
第一个 `select` 语句会等待从通道中读取数据,如果在 2 秒内没有读取到数据,就会打印超时信息。第二个 `select` 语句会尝试向通道中写入数据,如果在 2 秒内无法写入数据,就会打印超时信息。
需要注意的是,`select` 语句只能用于通信操作,而不能用于普通的计算操作。如果需要进行普通的计算操作,可以在 goroutine 中使用 `time.Sleep` 函数来模拟异步操作。
阅读全文