Dalam pengaturcaraan Go, "ralat masa jalan: alamat memori tidak sah atau penolakan penunjuk tiada" sering berlaku apabila mengakses atau membatalkan rujukan memori yang tidak sah. Ralat ini mungkin timbul dalam pelbagai konteks, termasuk operasi rangkaian seperti permintaan HTTP.
Mengenai webcrawler anda, ralat itu berkemungkinan berkaitan dengan mengakses badan respons (resp.Body) tanpa mula-mula menyemak ralat. Dalam fungsi basicFetcher, sebagai contoh, jika http.Get mengembalikan ralat, pembolehubah resp akan menjadi sifar, dan percubaan berikutnya untuk mengakses resp.Body akan gagal disebabkan oleh penyahrujukan penunjuk nil.
Untuk menangani isu ini, adalah penting untuk mengendalikan ralat dengan sewajarnya. Pertimbangkan untuk mengubah suai fungsi basicFetcher anda seperti berikut:
func basicFetcher(uri string, c chan int) { resp, err := http.Get(uri) if err != nil { fmt.Println(err) return } defer resp.Body.Close() _, err = ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(err) return } c <- resp.StatusCode }
Sekarang, jika http.Get atau ioutil.ReadAll menghadapi ralat, fungsi itu akan kembali dengan anggun, menghalang ralat penyahrujukan nol.
Seperti yang dicadangkan oleh twotwotwo, adalah amalan yang baik untuk kembalikan pasangan (hasil, ralat) daripada fungsi anda. Ini membolehkan anda mengendalikan ralat dan menamatkan fungsi jika perlu. Dengan mengembalikan ralat, anda boleh menyediakan lebih banyak konteks untuk ralat dan mendayakan pengendalian ralat yang lebih baik dalam fungsi utama anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah 'ralat masa jalan: alamat memori tidak sah atau penolakan penunjuk nil' dalam My Go Web Crawler?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!