Apabila menulis program, anda pasti akan menghadapi situasi yang memerlukan percubaan semula, seperti keabnormalan sambungan rangkaian, kegagalan sambungan pangkalan data, dsb. Untuk melaksanakan cuba semula dalam bahasa pengaturcaraan sebelumnya, biasanya perlu menulis berbilang pernyataan cuba-tangkap atau menggunakan pernyataan if-else bersarang. Tetapi dalam bahasa Go, anda boleh menggunakan perpustakaan mudah untuk melaksanakan fungsi seperti cuba.
Bahasa Go ialah bahasa pengaturcaraan sumber terbuka yang dilancarkan oleh Google Ia adalah bahasa ditaip secara statik dengan pengkompil yang cekap dan pengurusan memori selamat jenis. Konsep teras bahasa Go ialah kesederhanaan dan kemudahan penggunaan, jadi sintaks dan cirinya sangat ringkas dan jelas, malah boleh dikatakan sebagai "tiada haba buangan." Gaya yang ringkas tetapi cekap ini memberikan kelebihan unik bahasa Go dalam menulis aplikasi rangkaian, sistem teragih dan program konkurensi tinggi.
Bagi perpustakaan yang akan kami perkenalkan hari ini, perpustakaan cubalah yang dapat menjadikan golang lebih ringkas dan praktikal. Mari kita lihat cara menggunakan perpustakaan cuba untuk melaksanakan operasi seperti cuba dalam bahasa Go.
Sebelum menggunakan perpustakaan cuba, kita perlu memperkenalkan perpustakaan terlebih dahulu. Anda boleh mendapatkan dan memasang pustaka cuba melalui arahan berikut:
go get github.com/matryer/try
Selepas memperkenalkannya, kami boleh menggunakan perpustakaan cuba dalam atur cara. Mari kita lihat cara menggunakan perpustakaan cuba untuk melaksanakan operasi cuba semula.
Pustaka try menyediakan fungsi try.Do(), yang menerima fungsi jenis ralat func() dan cuba untuk melaksanakan fungsi . Jika pelaksanaan berjaya, tiada akan dikembalikan secara langsung, jika tidak, operasi akan dicuba semula sehingga pelaksanaan berjaya atau bilangan percubaan semula maksimum dicapai (lalai ialah 10 kali). Berikut ialah kod contoh bagi fungsi try.Do():
err := try.Do(func() error { // 尝试执行该函数 return nil }) if err != nil { // 函数执行失败 }
Sejak fungsi try.Do() menerima fungsi jenis ralat func(), kita perlu menentukan operasi yang perlu dicuba semula sebagai fungsi , dan hantar fungsi ke fungsi try.Do(). Sebagai contoh, fungsi berikut mensimulasikan sambungan rangkaian yang tidak normal:
func connect() error { // 假装网络连接异常 return errors.New("network error") }
Seterusnya, kita boleh menggunakan fungsi try.Do() untuk mencuba semula sambungan:
err := try.Do(func() error { // 尝试连接网络 return connect() }) if err != nil { // 连接失败,输出错误信息 fmt.Println(err) }
Dalam kod di atas, kami mentakrifkan fungsi connect() untuk mensimulasikan sambungan rangkaian yang tidak normal. Kami kemudian menghantar fungsi connect() ke fungsi try.Do() dan cuba semula operasi semasa melaksanakan. Jika sambungan akhirnya gagal, ralat akan dikembalikan dan kami boleh mengeluarkan mesej ralat dalam program.
Selain fungsi asas di atas, perpustakaan cuba juga menyediakan aplikasi yang lebih maju untuk menjadikan operasi cuba semula lebih mudah dan fleksibel .
3.1 Sesuaikan bilangan maksimum percubaan semula
Jika anda perlu menyesuaikan bilangan maksimum percubaan semula, anda boleh menetapkannya melalui atribut try.MaxRetries. Sebagai contoh, coretan kod berikut menetapkan bilangan maksimum percubaan semula kepada 5:
try.MaxRetries = 5
Selepas penetapan, bilangan maksimum percubaan semula yang ditetapkan akan digunakan setiap kali fungsi try.Do() dipanggil.
3.2 Tetapkan selang percubaan semula
Operasi percubaan semula yang berbeza mungkin memerlukan selang percubaan semula yang berbeza, jadi perpustakaan cuba juga menyediakan cara untuk menetapkan selang percubaan semula. Selang antara setiap percubaan semula boleh ditetapkan melalui fungsi try.Sleep, contohnya:
try.Sleep(2 * time.Second)
Dalam kod di atas, kami menetapkan selang antara setiap percubaan semula kepada 2 saat.
3.3 Tetapkan jenis ralat khusus
Sesetengah ralat tidak boleh dicuba semula, seperti alamat tidak dapat dicapai, ruang cakera penuh, dsb. Pustaka cuba menyediakan fungsi WithRetryIf(), yang membolehkan kami mencuba semula jenis ralat tertentu dalam operasi cuba semula. Sebagai contoh, coretan kod berikut hanya mencuba semula untuk ralat pengecualian sambungan rangkaian:
err := try.Do(func() error { // 尝试连接网络 return connect() }, try.RetryIf(func(err error) bool { // 针对网络连接异常的错误进行重试 if _, ok := err.(net.Error); ok { return true } else { return false } }))
Dalam kod di atas, kami mula-mula mentakrifkan fungsi connect() untuk mensimulasikan pengecualian sambungan rangkaian. Kemudian, kami melaksanakan fungsi connect() melalui fungsi try.Do() dan menggunakan fungsi WithRetryIf() untuk mencuba semula ralat "pengecualian sambungan rangkaian". Dalam fungsi RetryIf(), kami menentukan sama ada ralat semasa tergolong dalam net.Jenis ralat, dan jika ya, kembalikan benar, menunjukkan bahawa percubaan semula diperlukan.
Melalui pengenalan di atas, kita dapat melihat bahawa adalah sangat mudah dan mudah untuk menggunakan perpustakaan cuba dalam bahasa Go untuk melaksanakan operasi cuba semula. Hanya tentukan fungsi yang perlu dicuba semula dan hantar fungsi itu ke fungsi try.Do(). Pustaka cuba juga menyediakan fungsi lanjutan seperti menyesuaikan bilangan percubaan semula maksimum, menetapkan selang percubaan semula, dan mencuba semula untuk jenis ralat tertentu, menjadikan operasi cuba semula lebih fleksibel dan mudah.
Sudah tentu, sebagai tambahan kepada pustaka cuba, bahasa Go juga mempunyai beberapa pustaka berkuasa lain yang boleh digunakan untuk melaksanakan operasi cuba semula, seperti Uber's go-retry dan Hashicorp's go-retryablehttp. Oleh itu, semasa menulis program bahasa Go, kita boleh memilih perpustakaan yang paling sesuai untuk operasi cuba semula berdasarkan keperluan sebenar.
Atas ialah kandungan terperinci golang melaksanakan cuba. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!