Dalam bidang pembangunan Go Web, untuk mencapai fungsi penghalaan yang lebih cekap dan fleksibel, ramai pembangun memilih untuk memperkenalkan perpustakaan pihak ketiga seperti httprouter dan gorilla/mux. Walau bagaimanapun, dalam versi Go 1.22, pegawai tersebut telah mengoptimumkan http.ServeMux dengan ketara dalam perpustakaan standard, yang dijangka mengurangkan pergantungan pembangun pada perpustakaan penghalaan pihak ketiga.
Go 1.22 melaksanakan cadangan yang sangat dinanti-nantikan untuk meningkatkan keupayaan padanan corak pemultipleks perkhidmatan HTTP lalai dalam pakej bersih/http perpustakaan standard. Pemultipleks sedia ada (http.ServeMux) hanya boleh menyediakan fungsi pemadanan laluan asas, yang agak terhad, menyebabkan sejumlah besar perpustakaan pihak ketiga muncul untuk memenuhi keperluan pembangun untuk fungsi penghalaan yang lebih berkuasa. Pemultipleks baharu dalam Go 1.22 akan menutup jurang ciri dengan ketara dengan perpustakaan pihak ketiga dengan memperkenalkan keupayaan pemadanan lanjutan. Artikel ini secara ringkas akan memperkenalkan pemultipleks baharu (mux), menyediakan contoh pelayan REST, dan membandingkan prestasi mux perpustakaan standard baharu dengan gorila/mux.
Bagi pembangun Go yang mempunyai pengalaman menggunakan mux/penghala pihak ketiga (seperti gorila/mux), menggunakan mux standard baharu akan menjadi perkara yang mudah dan biasa. Adalah disyorkan bahawa pemaju terlebih dahulu membaca dokumentasi rasminya, yang ringkas dan jelas.
Kod berikut menunjukkan beberapa keupayaan padanan corak baharu mux:
<code class="language-go">package main import ( "fmt" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("GET /path/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "got path\n") }) mux.HandleFunc("/task/{id}/", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") fmt.Fprintf(w, "handling task with %s\n", id) }) http.ListenAndServe(":8090", mux) }</code>
Pengaturcara Go yang berpengalaman akan segera melihat dua ciri baharu:
/path/
dan tidak akan mengendalikan permintaan untuk kaedah HTTP lain. {id}
mengandungi aksara kad bebas, yang tidak disokong dalam versi sebelumnya. Kad bebas ini boleh memadankan komponen laluan tunggal dan pengendali boleh mendapatkan nilai padanan melalui kaedah PathValue
permintaan. Berikut ialah contoh menguji pelayan ini menggunakan arahan curl:
<code class="language-bash">$ gotip run sample.go # 在另一个终端测试 $ curl localhost:8090/what/ 404 page not found $ curl localhost:8090/path/ got path $ curl -X POST localhost:8090/path/ Method Not Allowed $ curl localhost:8090/task/leapcell/ handling task with leapcell</code>
Seperti yang dapat dilihat daripada keputusan ujian, pelayan akan menolak permintaan POST untuk /path/
dan hanya membenarkan permintaan GET (curl menggunakan permintaan GET secara lalai). Pada masa yang sama, apabila permintaan sepadan, aksara kad bebas id
akan diberikan nilai yang sepadan. Pembangun dinasihatkan untuk merujuk kepada dokumentasi ServeMux baharu secara terperinci untuk mengetahui lebih lanjut tentang ciri seperti laluan mengekor dan {id}
peraturan padanan kad bebas, serta padanan ketat laluan yang berakhir dengan {$}
.
Cadangan ini memberi perhatian khusus kepada kemungkinan konflik antara mod yang berbeza. Berikut ialah contoh:
<code class="language-go">mux := http.NewServeMux() mux.HandleFunc("/task/{id}/status/", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") fmt.Fprintf(w, "handling task status with %s\n", id) }) mux.HandleFunc("/task/0/{action}/", func(w http.ResponseWriter, r *http.Request) { action := r.PathValue("action") fmt.Fprintf(w, "handling task action with %s\n", action) })</code>
Apabila pelayan menerima permintaan untuk /task/0/status/
, kedua-dua pengendali boleh memadankan permintaan ini. Dokumentasi ServeMux baharu memperincikan peraturan keutamaan mod dan cara mengendalikan kemungkinan konflik. Jika konflik berlaku, proses pendaftaran akan mencetuskan panik. Untuk contoh di atas, mesej ralat berikut akan dipaparkan:
<code class="language-go">package main import ( "fmt" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("GET /path/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "got path\n") }) mux.HandleFunc("/task/{id}/", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") fmt.Fprintf(w, "handling task with %s\n", id) }) http.ListenAndServe(":8090", mux) }</code>
Mesej ralat ini terperinci dan praktikal. Dalam senario pendaftaran kompleks (terutamanya apabila mendaftar dalam pelbagai kedudukan kod sumber), butiran ini dapat membantu pemaju dengan cepat mencari dan menyelesaikan masalah konflik.
Siri Pelayan REST dalam GO menggunakan pelbagai kaedah untuk melaksanakan pelayan mudah dalam tugas/untuk digunakan dalam GO. Bahagian pertama adalah berdasarkan perpustakaan standard, dan bahagian kedua menggunakan penghala gorila/mux untuk memadamkan pelayan yang sama. Sekarang, dengan menggunakan MUX Go 1.22 yang dipertingkatkan untuk melaksanakan pelayan ini sekali lagi sangat penting, dan ia juga menarik untuk membandingkannya dengan penyelesaian menggunakan gorila/mux.
Berikut adalah sebahagian daripada kod pendaftaran mod wakil:
<code class="language-bash">$ gotip run sample.go # 在另一个终端测试 $ curl localhost:8090/what/ 404 page not found $ curl localhost:8090/path/ got path $ curl -X POST localhost:8090/path/ Method Not Allowed $ curl localhost:8090/task/leapcell/ handling task with leapcell</code>
Sama seperti contoh gorila/mux, berikut adalah permintaan penghalaan kepada prosedur pemprosesan yang berbeza dengan jalan yang sama dengan kaedah HTTP tertentu. Apabila menggunakan HTTP.Servemux lama, peranti yang sepadan dengan jenis ini akan mengarahkan permintaan ke program pemprosesan yang sama, dan kemudian program pemprosesan akan menentukan operasi mengikuti mengikut kaedah permintaan.
Berikut adalah contoh program pemprosesan:
<code class="language-go">mux := http.NewServeMux() mux.HandleFunc("/task/{id}/status/", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") fmt.Fprintf(w, "handling task status with %s\n", id) }) mux.HandleFunc("/task/0/{action}/", func(w http.ResponseWriter, r *http.Request) { action := r.PathValue("action") fmt.Fprintf(w, "handling task action with %s\n", action) })</code>
di sini proses diekstrak dari req.PathValue("id")
untuk mengekstrak nilai ID, yang sama dengan kaedah gorila. Walau bagaimanapun, kerana {id}
hanya sepadan dengan integer dengan ungkapan biasa, perlu memberi perhatian kepada kesilapan strconv.Atoi
yang dikembalikan.
Secara umum, hasil akhir sangat mirip dengan penyelesaian menggunakan gorila/mux. Berbanding dengan kaedah perpustakaan standard tradisional, MUX baru boleh melakukan operasi penghalaan yang lebih rumit, mengurangkan keperluan meninggalkan keputusan penghalaan kepada program pemprosesan itu sendiri, dan meningkatkan kecekapan pembangunan dan penyelenggaraan kod.
Sudah tentu, sesetengah pemaju akan terus memilih perpustakaan pihak ketiga yang biasa, yang juga munasabah. Router seperti Gorilla/Mux masih mempunyai lebih banyak fungsi daripada perpustakaan standard. Di samping itu, banyak pengaturcara Go memilih rangka kerja ringan seperti GIN kerana ia bukan sahaja menyediakan router, tetapi juga menyediakan alat pembida yang diperlukan untuk membina hujung web.
Singkatnya, pengoptimuman Perpustakaan standard GO 1.22 http.serv standard "tidak diragukan lagi perubahan positif. Tidak kira sama ada pemaju memilih untuk menggunakan pakej pihak ketiga atau mendesak menggunakan perpustakaan standard, fungsi meningkatkan perpustakaan standard memberi manfaat kepada seluruh komuniti pembangunan GO.
Akhirnya, cadangkan platform yang paling sesuai untuk menggunakan perkhidmatan GO: Leapcell
https://www.php.cn/link/7884effb9452a6d7a794999ef854afd
Atas ialah kandungan terperinci Go s http.servemux adalah semua yang anda perlukan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!