Rumah > Artikel > pembangunan bahagian belakang > Memahami dan Menggunakan Konteks dalam Go dan GoFr
Dalam Go, pakej konteks ialah alat asas yang direka untuk mengurus dan berkongsi data berskop permintaan, isyarat pembatalan dan tamat masa atau tarikh akhir merentas lapisan aplikasi yang berbeza.
Jenis konteks.Konteks menyediakan cara untuk membawa tarikh akhir, isyarat pembatalan dan nilai skop permintaan lain dalam cara hierarki yang boleh berantai. Ia direka bentuk agar tidak berubah, yang bermaksud bahawa setiap konteks terbitan baharu membawa sifat konteks induknya sambil menambah nilai atau gelagat baharu.
Bayangkan konteks sebagai beg pembawa khas yang menyimpan semua maklumat dan arahan yang diperlukan untuk tugas tertentu. Beg ini boleh dipindahkan dari fungsi ke fungsi, memastikan semua orang yang terlibat mempunyai konteks (maklumat) yang sama dan boleh bertindak sewajarnya. Ia juga boleh mengandungi butang musnah sendiri (isyarat pembatalan) untuk menghentikan operasi jika perlu.
Sebelum pengenalan Konteks dalam Go, mengurus data berskop permintaan dan isyarat pembatalan adalah tugas yang menyusahkan. Pembangun terpaksa bergantung pada penyelesaian ad-hoc, seperti menyampaikan struct tersuai atau menggunakan pembolehubah global, untuk berkongsi data dan isyarat antara fungsi dan goroutin. Walau bagaimanapun, pendekatan ini terdedah kepada ralat, sukar untuk dikekalkan dan sering membawa kepada gandingan yang ketat antara komponen.
Keperluan untuk Konteks timbul daripada fakta bahawa banyak operasi dalam program adalah tidak segerak, serentak, atau bergantung pada sistem luaran. Dalam kes sedemikian, adalah penting untuk mempunyai cara untuk menyebarkan isyarat pembatalan, tarikh akhir dan data berskop permintaan merentas pelbagai fungsi dan goroutin.
Mari kita pertimbangkan beberapa senario untuk menggambarkan keperluan untuk Konteks:
Bayangkan anda adalah orang yang menerima pesanan di restoran yang sibuk. Apabila pesanan tiba, anda menyerahkannya kepada salah seorang tukang masak mahir anda. Tetapi bagaimana jika pelanggan tiba-tiba memutuskan untuk pergi? Tanpa teragak-agak, anda akan memaklumkan chef untuk berhenti memproses pesanan itu untuk mengelakkan pembaziran bahan. Senario ini mencerminkan cara konteks berfungsi dalam Go.
Andaikan aplikasi anda membuat permintaan web kepada API luaran atau menjalankan arahan sistem. Dalam sistem gred pengeluaran, adalah penting untuk menetapkan tamat masa. Inilah sebabnya:
Ketergantungan API: Bayangkan perkhidmatan anda bergantung pada API luaran. Jika API itu berjalan perlahan atau menjadi tidak bertindak balas, anda tidak mahu sistem anda membuat sandaran dengan permintaan yang belum selesai. Tamat masa memastikan bahawa jika panggilan API melebihi tempoh yang ditentukan, konteks yang berkaitan akan dibatalkan, membolehkan aplikasi anda mengendalikan situasi dengan anggun.
Kemerosotan Prestasi: Tanpa tamat masa, perlahan luaran
kebergantungan boleh membawa kepada kesan melata. Permintaan tertunggak meningkatkan beban, merendahkan prestasi dan memberi kesan kepada responsif sistem secara keseluruhan. Dengan menggunakan konteks dengan tarikh akhir, anda boleh menghalang isu ini.
Pakej konteks dalam Go adalah serba boleh dan digunakan dalam pelbagai senario untuk mengurus data berskop permintaan, isyarat pembatalan dan tamat masa.
Berikut ialah beberapa kes penggunaan dunia sebenar yang biasa:
1. Menyebarkan ID Surih Merentasi Perkhidmatan Teragih
Dalam seni bina perkhidmatan mikro, mengesan permintaan merentas perkhidmatan yang berbeza adalah penting untuk pemantauan dan penyahpepijatan. Pakej konteks membolehkan anda menyebarkan ID surih dan metadata lain merentasi sempadan perkhidmatan, memastikan pengelogan dan maklumat pengesanan yang konsisten sepanjang kitaran hayat permintaan.
2. Melepasi Token Pengesahan
Dalam kebanyakan aplikasi, token pengesahan atau maklumat pengguna perlu dihantar melalui lapisan aplikasi yang berbeza. Pakej konteks menyediakan cara yang bersih untuk mengendalikan perkara ini, memastikan maklumat pengesahan tersedia di mana perlu tanpa mencemarkan tandatangan fungsi dengan parameter tambahan.
3. WebSocket dan API Penstriman
Dalam WebSocket dan API penstriman, Konteks digunakan untuk mengurus jangka hayat sambungan dan menyebarkan data berskop permintaan, seperti ID pengguna dan maklumat sesi. Ini membolehkan anda melaksanakan ciri seperti pengesahan, pengehadan kadar dan pengurusan sesi dengan cekap.
Pakej konteks dalam Go menawarkan beberapa cara untuk mencipta dan memanipulasi objek konteks. Berikut ialah pecahan jenis yang biasa digunakan:
Ini adalah konteks paling asas dan berfungsi sebagai titik permulaan yang kosong. Ia tidak membawa sebarang isyarat pembatalan atau tarikh akhir. Gunakannya apabila tiada konteks khusus diperlukan.
Satu-satunya masa TODO digunakan dan bukannya Latar Belakang ialah apabila pelaksanaannya tidak jelas atau konteksnya belum diketahui.
Biasanya digunakan dalam fungsi utama, permulaan dan ujian.
ctx := context.Background()
ctx2 := context.TODO()
Mencipta konteks baharu yang diperoleh daripada konteks induk., Kaedah WithCancel mengembalikan salinan konteks induk bersama-sama dengan fungsi batal; menggunakan fungsi batal mengeluarkan sumber yang berkaitan dengan konteks dan harus dipanggil sebaik sahaja operasi dalam jenis Konteks akhirnya selesai.
Digunakan untuk membatalkan operasi dalam goroutine apabila syarat tertentu dipenuhi.
parentCtx := context.Background()
ctx, cancel := context.WithCancel(parentCtx)
defer cancel() // Bersihkan sumber
Sama seperti menetapkan tarikh akhir untuk diri sendiri, anda boleh menetapkan tarikh akhir untuk konteks. Go akan membatalkan konteks secara automatik untuk anda jika had masa yang anda tentukan untuk menyelesaikannya tercapai. Ia mencipta konteks baharu yang diperoleh daripada konteks induk dengan tarikh akhir tertentu.
Berguna apabila anda mempunyai tarikh akhir tertentu untuk menyelesaikan operasi.
parentCtx := context.Background()
tarikh akhir := masa.Sekarang().Tambah(10 * masa.Kedua)
ctx, cancel := context.WithDeadline(parentCtx, tarikh akhir)
defer cancel() // Bersihkan sumber
Mencipta konteks baharu yang diperoleh daripada konteks induk dengan pasangan nilai kunci yang berkaitan. Ini membolehkan anda menyimpan dan mendapatkan maklumat khusus permintaan dalam konteks. WithValue menerima konteks induk dan mengembalikan salinan konteks. Akibatnya, daripada menulis ganti nilai, ia mencipta pendua baharu dengan pasangan nilai kunci baharu.
Berguna untuk menghantar data berskop permintaan melalui konteks, seperti token pengesahan atau ID surih.
parentCtx := context.Background()
userIDKey := "token-auth"
ctx := context.WithValue(parentCtx, userIDKey, "abc123")
Mencipta konteks dengan tamat masa yang berkaitan. Konteks dibatalkan secara automatik selepas tempoh yang ditentukan. WithTimeout, membenarkan program untuk meneruskan di tempat yang mungkin digantung, memberikan pengguna akhir pengalaman yang lebih baik. Ia menerima tempoh yang singkat sebagai parameter, bersama-sama dengan konteks induk dan menamatkan fungsi jika ia berjalan melebihi tempoh tamat masa.
Berguna untuk menetapkan tarikh akhir pada operasi.
parentCtx := context.Background()
ctx, cancel := context.WithTimeout(parentCtx, 5*time.Second)
defer cancel() // Bersihkan sumber
Sekarang kita telah meneroka kuasa konteks dalam Go, mari kita mendalami cara GoFr mengambil langkah lebih jauh dengan Konteks GoFr.
GoFr ialah rangka kerja pembangunan perkhidmatan mikro pendapat yang dibina di atas Go. Ia bertujuan untuk menyelaraskan proses pembangunan dengan menyediakan pendekatan berstruktur untuk membina perkhidmatan mikro yang teguh dan berskala.
Konteks GoFr memanjangkan kefungsian pakej konteks standard Go dengan cantik dengan mencipta pembalut di sekelilingnya. Pembalut ini menyediakan set kaya kebergantungan prakonfigurasi yang boleh diakses terus melalui objek konteks. Konteks yang dimuatkan sepenuhnya ini membolehkan pembangun mengakses pengelogan, sambungan pangkalan data, perkhidmatan asas, jejak dan metrik dengan lancar - semua daripada objek konteks tunggal.
func MyHandler(c *gofr.Context) (interface{}, error) { // Logging c.Info("Processing request...") // Database access var value int err := c.SQL.QueryRowContext(c, "select 2+2").Scan(&value) if err != nil { return nil, datasource.ErrorDB{Err: err, Message: "error from sql db"} } // Accessing another service resp, err := c.GetHTTPService("anotherService").Get(c, "book", nil) if err != nil { return nil, err } // Creating a tracing span span := c.Trace("some-sample-work") defer span.End() // ... perform some work return value, nil }
Dalam contoh ini, perhatikan cara kami boleh mengakses fungsi seperti pengelogan (c.Info), interaksi pangkalan data (c.SQL), panggilan perkhidmatan (c.GetHTTPService) dan pengesanan (c.Trace) terus melalui objek Konteks GoFr (c).
Konteks GoFr tersedia dalam semua pengendali HTTP, meningkatkan pengalaman pembangunan dengan menyediakan cara terpusat untuk mengurus pelbagai aspek aplikasi. Penyepaduan ini memastikan pembangun boleh menumpukan pada logik perniagaan sambil memanfaatkan keupayaan GoFr untuk pengurusan konteks yang berkesan.
Mengenai reka bentuk program, pakej konteks Golang ialah alat yang sangat berguna. Konteks dalam Go berfungsi sebagai alat yang berkuasa untuk mengurus data berskop permintaan, isyarat pembatalan dan tarikh akhir. Sama ada anda membina perkhidmatan mikro, API atau aplikasi web, konteks memastikan pengendalian sumber bersih dan gelagat yang konsisten.
Buat daftar keluar GoFr dan ia adalah Github Repo dan sokongnya dengan memberikannya ⭐.
Atas ialah kandungan terperinci Memahami dan Menggunakan Konteks dalam Go dan GoFr. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!