go timeout context 继承,超时 context.Done() 通道关闭的顺序

package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// 创建一个父级 context,超时时间为 2 秒
	parentCtx, parentCancel := context.WithTimeout(context.Background(), 2*time.Second)
	defer parentCancel()
	// 创建一个子级 context,超时时间为 1 秒
	childCtx, childCancel := context.WithTimeout(parentCtx, 6*time.Second)
	defer childCancel()
	// 在子级 context 中执行一个耗时操作
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			fmt.Println("子级 context 超时")
		}
	}(childCtx)
	// 在父级 context 中执行一个耗时操作
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			fmt.Println("父级 context 超时")
		}
	}(parentCtx)
	// 等待一段时间,模拟耗时操作
	time.Sleep(8 * time.Second)
}

你可能感兴趣的:(golang,开发语言,后端)