Dalam bidang pengendalian permintaan HTTP menggunakan http.HandleFunc Go, keperluan sering timbul untuk menyebarkan nilai konteks dalam kod. Pendekatan konvensional melibatkan penetapan kunci konteks tersuai dan menggunakan fungsi konteks.WithValue, tetapi kebimbangan mungkin timbul mengenai potensi tiruan objek permintaan asal.
Untuk menangani perkara ini kebimbangan, pendekatan yang disemak menghapuskan tiruan objek permintaan. Sebaliknya, kaedah Request.WithContext digunakan untuk mencipta salinan permintaan yang cetek, mengekalkan objek asal dan konteksnya. Dengan mengembalikan penuding kepada salinan cetek ini, kod berikutnya beroperasi pada konteks yang dikemas kini tanpa mengganggu permintaan asal.
// Context key to store the value var myContext = contextKey("myContext") // Function to set a context value func setValue(r *http.Request, val string) *http.Request { return r.WithContext(context.WithValue(r.Context(), myContext, val)) } // http.HandleFunc example http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { r = setValue(r, "foobar") })
Dalam kod yang disemak ini, fungsi setValue mencipta salinan permintaan yang cetek, menambah nilai konteks pada permintaan baharu. Permintaan asal kekal tidak disentuh, memastikan integriti konteks sepanjang proses pengendalian permintaan.
Untuk memastikan konteks yang diubah suai diserahkan kepada pengendali seterusnya, permintaan yang dikemas kini objek harus dihantar secara eksplisit kepada pengendali lain. Ini boleh dilakukan seperti berikut:
// Passing the updated request to another handler http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { r = setValue(r, "foobar") someOtherHandler.ServeHTTP(w, r) })
Dengan mengikut garis panduan ini, nilai konteks boleh ditetapkan dan disebarkan dengan berkesan dalam http.HandleFuncs, memelihara integriti objek permintaan asal dan memastikan aliran konteks lancar sepanjang permintaan -proses pengendalian.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menyebarkan nilai konteks dengan berkesan dalam http.HandleFunc dalam Go tanpa menimpa objek permintaan asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!