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.
Tugas di tangan ialah mencipta "klon " (atau salinan) ctx konteks Go supaya:
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) }() }
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`. }() }
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!