对于连接外部资源或需要限制执行时间的程序来说,超时非常重要。由于通道和 select,在 Go 中实现超时既简单又优雅。
package main
import (
"fmt"
"time"
)
func main() {
// 在我们的示例中,假设我们正在执行一个外部调用,该调用在 2 秒后通过通道 c1 返回其结果。请注意,通道是有缓冲的,因此 goroutine 中的发送操作是非阻塞的。这是一个常见的模式,用于防止在通道永远没有被读取的情况下发生 goroutine 泄漏。
c1 := make(chan string, 1)
go func() {
time.Sleep(2 * time.Second)
c1 <- "result 1"
}()
// 这是实现超时的 select 语句。res := <-c1 等待结果,而 <-time.After 等待在 1 秒超时后发送的值。由于 select 会选择第一个准备好的接收操作,如果操作超过了允许的 1 秒,我们将选择超时的情况。
select {
case res := <-c1:
fmt.Println(res)
case <-time.After(1 * time.Second):
fmt.Println("timeout 1")
}
// 如果我们允许更长的超时(例如 3 秒),那么从 c2 的接收将会成功,我们将打印结果。
c2 := make(chan string, 1)
go func() {
time.Sleep(2 * time.Second)
c2 <- "result 2"
}()
select {
case res := <-c2:
fmt.Println(res)
case <-time.After(3 * time.Second):
fmt.Println("timeout 2")
}
}运行这个程序会显示第一个操作超时,第二个操作成功。
$ go run timeouts.go
timeout 1
result 2原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。