读 etcd 源码看到一种超时的设置方法,控制一个循环的总时长,每轮迭代检查一下是否超时,适用于对超时时间要求不是非常精细,并且操作不会阻塞的场景

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 6*time.Second)
	defer cancel()

	for i := 0; i < 10; i++ {
		select {
		case <-ctx.Done():
			fmt.Println(ctx.Err())
			return
		default:
		}
		time.Sleep(time.Second * time.Duration(i))
		fmt.Printf("in time: %d\n", i)
	}
}