Memahami dan Menggunakan Konteks dalam Go dan GoFr

WBOY
Lepaskan: 2024-07-17 04:51:42
asal
605 orang telah melayarinya

Context in go

Apakah itu Konteks?

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.


Mengapakah kita memerlukan Konteks?

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:

1. Analogi Restoran

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.

  • Penyebaran Pembatalan: Dalam analogi restoran, pelanggan yang keluar sepadan dengan isyarat pembatalan. Begitu juga, dalam Go, konteks membenarkan penyebaran isyarat pembatalan yang anggun. Apabila operasi induk (cth., pengendali permintaan HTTP) dibatalkan, semua operasi anak yang berkaitan (cth., pertanyaan pangkalan data atau panggilan API) ditamatkan dengan segera. Ini menghalang kebocoran sumber dan memastikan pembersihan yang cekap.

2. Mengendalikan API Lambat dan Tamat Masa

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.



Penggunaan Konteks:

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.


Pelbagai Jenis Konteks dalam Go:

Pakej konteks dalam Go menawarkan beberapa cara untuk mencipta dan memanipulasi objek konteks. Berikut ialah pecahan jenis yang biasa digunakan:

1. Konteks Latar Belakang/Konteks TODO

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()

2. konteks.DenganBatal

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

3. konteks.DenganTarikh Akhir

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

4. konteks.DenganNilai

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")

5. konteks.WithTimeout

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

Different types of context in Golang



Konteks GoFr: Konteks Supercharged untuk Aplikasi Go

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.

Contoh

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
}
Salin selepas log masuk

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.


Kesimpulan

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!