Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencipta Konteks dalam Go yang Mengabaikan Pembatalan?

Bagaimana untuk Mencipta Konteks dalam Go yang Mengabaikan Pembatalan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-09 14:58:02635semak imbas

How to Create a Context in Go That Ignores Cancellation?

Mencipta Konteks Tanpa Membatalkan Penyebaran dalam Go

Dalam Go, konteks membawa maklumat berkaitan pelaksanaan seperti tarikh akhir dan token pembatalan. Walau bagaimanapun, senario tertentu mungkin memerlukan penciptaan konteks berasingan yang berkongsi data yang sama tetapi tidak terjejas oleh pembatalan konteks asal.

Pernyataan Masalah

Tugas di tangan ialah mencipta "klon " (atau salinan) ctx konteks Go supaya:

  • Ia mengandungi semua nilai yang disimpan dalam ctx asal.
  • Ia tidak dibatalkan apabila ctx dibatalkan.

Penyelesaian

Memandangkan konteks.Konteks ialah antara muka, anda boleh menentukan pelaksanaan anda sendiri yang mengabaikan isyarat pembatalan. Berikut ialah contoh:

package main

import (
    "context"
    "time"
)

type noCancel struct {
    ctx context.Context
}

func (c noCancel) Deadline() (time.Time, bool)       { return time.Time{}, false }
func (c noCancel) Done() <-chan struct{}             { return nil }
func (c noCancel) Err() error                        { return nil }
func (c noCancel) Value(key interface{}) interface{} { return c.ctx.Value(key) }

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return noCancel{ctx: ctx}
}

func main() {
    ctx := context.Background()
    clone := WithoutCancel(ctx)

    // Create a goroutine using the clone context.
    go func() {
        // This goroutine will never be interrupted by cancelations on `ctx`.
        time.Sleep(time.Second)
    }()
}

Penggunaan

Anda boleh menggunakan fungsi WithoutCancel untuk mencipta konteks klon dalam mana-mana fungsi atau kaedah:

func f(ctx context.Context) {
    // Create a non-cancelable clone.
    clone := WithoutCancel(ctx)

    // Start an async task using the clone context.
    go func() {
        // This goroutine will not be affected by cancellations on `ctx`.
    }()
}

Kesimpulan

Penyelesaian ini menyediakan cara mudah untuk mencipta konteks yang tidak pernah dibatalkan, membolehkan anda melakukan tugas tak segerak yang melebihi konteks asal. Ini amat berguna apabila anda ingin mengelakkan penamatan pramatang tugas latar belakang disebabkan pembatalan konteks.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Konteks dalam Go yang Mengabaikan Pembatalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn