]> 127.0.0.1 Git - part/.git/commitdiff
1 v0.28.0+20231109cb7ab25
authorqydysky <qydysky@foxmail.com>
Thu, 9 Nov 2023 16:06:27 +0000 (00:06 +0800)
committerqydysky <qydysky@foxmail.com>
Thu, 9 Nov 2023 16:06:27 +0000 (00:06 +0800)
ctx/Ctx.go
ctx/Ctx_test.go

index 67c04d0d55f6f6eea26077bdd34b73b0641bf0c8..af11410294452444c5852bb0a134e6f65c7eba1c 100644 (file)
@@ -104,6 +104,13 @@ func Done(ctx context.Context) bool {
        return false
 }
 
+// errCtx := pctx.Value[error]{}
+//
+// cancelC = errCtx.LinkCtx(cancelC)
+//
+// pctx.PutVal(cancelC, &errCtx, fmt.Errorf("%vs未接收到有效数据", readTO))
+//
+// err := errCtx.Get()
 type Value[T any] struct {
        data T
 }
@@ -125,3 +132,21 @@ func PutVal[T any](ctx context.Context, key *Value[T], v T) {
                pt.Set(v)
        }
 }
+
+var (
+       selfCancel     = "selfCancel"
+       ErrNotCarryYet = errors.New("ErrNotCarryYet")
+)
+
+func CarryCancel(ctx context.Context, cancelFunc context.CancelFunc) context.Context {
+       return context.WithValue(ctx, &selfCancel, cancelFunc)
+}
+
+func CallCancel(ctx context.Context) error {
+       if pt, ok := ctx.Value(&selfCancel).(context.CancelFunc); ok {
+               pt()
+       } else {
+               return ErrNotCarryYet
+       }
+       return nil
+}
index dd3a24d42eea26fdf52ad74692452a43b8006f56..4c9a47a7baf1991e51c951b8e9a07254252b70aa 100644 (file)
@@ -66,3 +66,17 @@ func TestMain3(t *testing.T) {
                t.Fatal()
        }
 }
+
+func TestMain4(t *testing.T) {
+       ctx := CarryCancel(context.WithCancel(context.Background()))
+       time.AfterFunc(time.Millisecond*500, func() {
+               if CallCancel(ctx) != nil {
+                       t.Fail()
+               }
+       })
+       n := time.Now()
+       <-ctx.Done()
+       if time.Since(n) < time.Millisecond*500 {
+               t.Fail()
+       }
+}