Konteks dalam Go menyediakan mekanisme untuk menghantar nilai sewenang-wenangnya bersama-sama dengan permintaan dan menjejaki pembatalan. Secara lalai, semua konteks berkongsi mekanisme pembatalan yang sama. Walau bagaimanapun, senario tertentu mungkin memerlukan penyahgandingan penyebaran konteks daripada pembatalan.
Pertimbangkan pengendali HTTP yang melaksanakan tugas di luar jangka hayat permintaan. Selepas mengembalikan respons, pengendali boleh memulakan tugas tak segerak dalam goroutine. Tugas ini mungkin memerlukan akses kepada nilai konteks tetapi tidak boleh ditamatkan jika konteks permintaan asal dibatalkan.
TanpaBatal telah diperkenalkan dalam Go 1.21, menyediakan cara yang mudah untuk mencipta konteks tidak membatalkan. Menggunakan kaedah ini, seseorang boleh mendapatkan salinan konteks asal yang mengandungi semua nilai yang disimpan tetapi kekal bebas daripada status pembatalannya.
Sebelum Pergi 1.21, tersuai pelaksanaan konteks tidak membatalkan adalah perlu. Kuncinya ialah mencipta jenis yang memenuhi konteks. Antara muka konteks dan mengatasi kaedah berikut untuk mengelakkan pembatalan:
Selain itu, pelaksanaan mesti menyimpan konteks asal dan mewakilkan panggilan Value() untuk mendapatkan semula nilai yang disimpan.
import ( "context" "github.com/mypackage/mycontext" ) func Handler(ctx context.Context) (interface{}, error) { result := doStuff(ctx) newContext := mycontext.WithoutCancel(ctx) go func() { doSomethingElse(newContext) }() return result }
Dengan memahami prinsip di sebalik konteks tidak membatalkan dan memanfaatkan alatan yang tersedia, pembangun boleh mencipta penyelesaian tersuai atau menggunakan fungsi terbina dalam Go untuk mencapai penyebaran konteks yang diingini tanpa pembatalan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Konteks dalam Go Tanpa Penyebaran Pembatalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!