28-timeout

// timeouts 对于需要连接到外部资源或者需要绑定执行时间的程序非常重要
//  使用通道和select在Go中实现timeout简单切优雅
package main

import (
	"fmt"
	"time"
)

func main() {
	c1 := make(chan string, 1) // 创建一个缓冲区为1的通道,在不读取的情况下,这是防止goroutine泄露的常见模式
	go func() {                // 另外的goroutine将在两秒后向通道c1中写入“result1”
		time.Sleep(2 * time.Second)
		c1 <- "result1"
	}()

	select { // select语句实现超时选择
	case res := <-c1: // 等待上面的goroutine返回结果
		fmt.Println(res)
	case <-time.After(1 * time.Second): // 等待1秒后将时间写入返回的通道中
		fmt.Println("timeout1")
	}

	c2 := make(chan string, 1)
	go func() {
		time.Sleep(2 * time.Second)
		c2 <- "result2"
	}()

	select {
	case res := <-c2:
		fmt.Println(res)
	case <-time.After(3 * time.Second): // 等待3秒后将时间写入返回的通道中
		fmt.Println("timeout2")
	}
}
上次修改: 10 January 2020