028_go语言中的超时处理
代码演示
package main import "fmt" import "time" func main() { c1 := make(chan string, 1) go func() { time.Sleep(time.Second * 2) c1 <- "result 1" }() select { case res := <-c1: fmt.Println(res) case <-time.After(time.Second * 1): fmt.Println("timeout 1") } c2 := make(chan string, 1) go func() { time.Sleep(time.Second * 2) c2 <- "result 2" }() select { case res := <-c2: fmt.Println(res) case <-time.After(time.Second * 3): fmt.Println("timeout 2") } }
代码运行结果
timeout 1 result 2
代码解读
- 以上是超时的两个小例子,go语言中可以用select优雅简洁的控制超时
- 第一个go func,我们用来假象程序执行了一个外部调用,并且两秒钟以后才能返回结果
- 紧接着,我们用select和case语句控制超时,第一条case语句开始没有执行,因为处于阻塞状态,第二条语句超时时间设置为了1秒,所以会被执行
- 第二个go func同理,但是第case语句的超时时间设置为了3秒,所以还没有超时的情况下,第一条case语句会拿到结果,进而被执行