Konteks adalah salah satu fitur penting dalam Go yang memungkinkan konkurensi. Di Go, "konteks" mengacu pada paket yang menyediakan fungsionalitas untuk nilai cakupan permintaan dan sinyal pembatalan melintasi batas API.
Paket konteks bekerja secara bersamaan dengan model konkurensi Go, berdasarkan konsep goroutine. Goroutine adalah utas eksekusi ringan yang dapat Anda buat dan kelola secara efisien, membuatnya mudah untuk membuat program bersamaan di Go.
Paket Konteks
Paket konteks menyediakan fungsionalitas untuk membatalkan fungsi yang berjalan lama atau seluruh rantai panggilan. Paket ini juga membantu menyimpan nilai cakupan permintaan untuk akses di mana saja dalam rantai panggilan. Fitur ini berguna saat bekerja dengan Lebah atau layanan mikro, di mana permintaan dapat menjangkau beberapa panggilan fungsi dan Anda ingin membatalkannya atau melampirkan nilai tertentu padanya.
Inilah cara Anda dapat mengimpor paket konteks di Pergi program.
impor"konteks"
Fungsi konteks mencakup Konteks tipe struct dari paket konteks. Secara konvensional, Anda harus menggunakan ctx sebagai nama variabel instan.
fungsioperasi(konteks ctx. Konteks) {
}
Fungsi dapat mengembalikan tipe struktur Konteks untuk fungsi dan operasi lain.
fungsioperasi(konteks ctx. Konteks)konteks.Konteks {
}
Anda dapat membuat konteks baru dengan MELAKUKAN fungsi paket konteks. Fungsi TODO membuat konteks baru dengan nilai konteks. Selesai(), saluran yang akan ditutup pada pembatalan konteks. Anda harus menggunakannya sebagai placeholder saat Anda membutuhkan konteks tetapi tidak ada konteks induk yang cocok.
impor"konteks"
fungsiutama() {
ctx := konteks. MELAKUKAN()
}
Alternatifnya, the Latar belakang fungsi membuat konteks baru tanpa nilai dan saluran Selesai kosong.
ctx := konteks. Latar belakang()
Anda harus menggunakan fungsi Latar Belakang sebagai akar pohon konteks.
Konteks Dengan Nilai
Paket konteks menyediakan fungsionalitas untuk menyebarkan nilai dan sinyal pembatalan. Anda dapat menggunakan nilai untuk informasi dari data cakupan permintaan hingga sinyal pembatalan dan tenggat waktu.
Paket konteks juga memungkinkan pembuatan konteks anak yang diwarisi dari konteks induk, memungkinkan untuk efisien penanganan nilai dan sinyal pembatalan di seluruh program karena Anda dapat meneruskan konteks melalui beberapa fungsi.
Berikut adalah contoh melewati konteks melalui fungsi dengan paket konteks.
impor (
"konteks"
)fungsikonteks berharga(konteks ctx. Konteks)konteks.Konteks {
kembali konteks. WithValue (ctx, "kunci sandi", "hfouneqcelkwfu")
}
fungsiterimaContextData(konteks ctx. Konteks)setiap {
passKey := ctx. Nilai("kunci sandi")
kembali passKey
}
Itu konteks berharga fungsi mengambil contoh konteks dan mengembalikan contoh konteks untuk fungsi berikut. Contoh konteks adalah nilai yang dibuat dengan WithValue metode. Metode WithValue mengambil instance konteks dari fungsi dan pasangan kunci-nilai.
Untuk mengambil data dari konteks, Anda harus membuat konteks baru dengan MELAKUKAN atau Latar belakang fungsi dan meneruskan konteks ke fungsi (dalam hal ini, ValueContext) dan menerima konteks dengan terimaContextData fungsi.
fungsiutama() {
ctx := konteks. Latar belakang()
ctx = konteks berharga (ctx)
fmt. Println (receiveContextData (ctx))
}
Variabel ctx adalah instance konteks dari fungsi Background. Fungsi ValueContext mengambil variabel ctx dan mengembalikan konteks dengan nilai yang diambil oleh fungsi acceptContextData dan mengembalikan nilai dari key-value pair.
Batas Waktu Konteks dan Tenggat Waktu
Itu konteks package menyediakan fungsionalitas untuk mengatur batas waktu dan tenggat waktu dalam operasi. Menetapkan batas waktu dan tenggat waktu berguna untuk operasi yang perlu mengejar ketinggalan.
Batas waktu adalah durasi waktu yang dibutuhkan operasi. Anda dapat menyetel batas waktu agar operasi berlangsung selama 4 detik; setelah itu, konteks membatalkan permintaan.
Di sisi lain, tenggat waktu menentukan titik absolut di mana suatu operasi harus dibatalkan.
Anda dapat menggunakan Dengan Timeout metode untuk mengatur batas waktu konteks. Inilah cara Anda mengatur batas waktu 2 detik.
fungsiutama() {
ctx, batal := konteks. WithTimeout (konteks. Latar belakang(), 2 * waktu. Kedua)
menunda membatalkan()
// beberapa operasi
}
Itu utama fungsi membuat konteks dengan batas waktu dua detik. Fungsi WithTimeout mengembalikan fungsi pembatalan yang dapat Anda tunda untuk pembatalan saat keluar dari fungsi utama.
Anda dapat mendeklarasikan tenggat waktu dengan Dengan Batas Waktu metode. Metode WithDeadline mengambil contoh konteks dan waktu tenggat waktu.
fungsilakukan sesuatu(konteks ctx. Konteks) {
deadlineTime := waktu. Sekarang().Tambah(1500 * waktu. Mili detik)
ctx, ctxBatal := konteks. WithDeadline (ctx, deadlineTime)
menunda ctxBatal()// beberapa operasi
ctxBatal()
}
Itu lakukan sesuatu fungsi mengambil dalam konteks, dan deadlineTime variabel adalah waktu sebelum konteks tenggat waktu. Itu ctx variabel adalah konteks dengan tenggat waktu.
Itu ctxCancel variabel membatalkan konteks ketika konteks melebihi tenggat waktu.
Praktik Terbaik untuk Menggunakan Konteks di Go
Hindari menggunakan konteks sebagai variabel global. Menggunakan konteks sebagai variabel global dapat menyebabkan perilaku kode yang tidak terduga dan kesalahan yang sulit dilacak, dan gunakan konteks dengan hemat untuk mengurangi kerumitan kode.
Terakhir, gunakan konteks sebagai sinyal, bukan jaminan. Membatalkan konteks tidak menjamin bahwa semua goroutine akan berhenti berjalan; itu hanyalah sebuah sinyal, dan goroutine adalah konteks agnostik.