Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah saya mendapat ralat kompilasi dengan potensi dereference null ptr dalam Go?

Bolehkah saya mendapat ralat kompilasi dengan potensi dereference null ptr dalam Go?

WBOY
WBOYke hadapan
2024-02-08 21:50:21735semak imbas

在 Go 中,我可能会遇到潜在的 null ptr 取消引用的编译错误吗?

Dalam bahasa Go, tidak akan ada potensi ralat penyusunan dereference penuding nol. Ini kerana bahasa Go mengelakkan masalah penunjuk nol mengikut reka bentuk. Apabila anda mengisytiharkan pembolehubah, ia dimulakan kepada nilai sifar secara lalai, bukan penunjuk nol. Pada masa yang sama, bahasa Go juga menyediakan mekanisme pengendalian ralat yang kaya, seperti menggunakan berbilang nilai pulangan untuk mengembalikan maklumat ralat, dan menggunakan penangguhan dan panik/pulih untuk mengendalikan pengecualian. Ciri-ciri ini membolehkan bahasa Go menangkap kemungkinan ralat penunjuk nol semasa fasa penyusunan dan menyediakan persekitaran pengaturcaraan yang lebih selamat dan boleh dipercayai. Oleh itu, dalam bahasa Go, tidak akan ada ralat kompilasi yang serupa dengan "null ptr dereference".

Kandungan soalan

Seorang rakan sekerja menyahrujuk null ptr in go.

Saya cadangkan dia melakukan apa yang saya lakukan - apabila bekerja dalam bahasa lain, saya cenderung untuk menaikkan tahap amaran dan menukar amaran kepada ralat. c# sebagai contoh, yang bermaksud saya tidak dapat menyusun kod ini:

private static string bad_deref(object? object)
{
    return object.tostring();
}

Sebab saya faham

x.cs(y,z): [CS8602] Dereference of a possibly null reference.

Untuk menjadi jelas, ini cukup bagus.

Tetapi dia memberitahu saya bahawa go tidak mempunyai tahap amaran untuk but, dan dengan menggoogkannya, nampaknya dia betul.

Jadi bagaimana untuk menyelesaikan masalah ini secara berterusan? Adakah kita kembali kepada nasihat C lama "pengaturcara yang baik tidak membuat kesilapan" dan jika anda tidak bekerja dengan orang yang sempurna, penyimpangan ptr nol kadang-kadang akan berlaku?

Penyelesaian

Betul: anda tidak boleh menyebabkan ralat pengkompil dengan membatalkan rujukan penunjuk tanpa mengendalikan kes nil. Itu kerana spesifikasi bahasa membenarkannya. Tiada apa yang boleh anda lakukan mengenainya.

Anda boleh menulis kod yang salah/salah dalam mana-mana bahasa, cara untuk menangkap ralat awal atau mengurangkannya adalah dengan menulis ujian dalam hampir mana-mana bahasa.

Go mempunyai gorangka kerja ujian yang hebat terbina dalam alat itu sendiri. Anda pasti perlu memanfaatkannya. Tulis ujian semasa dalam perjalanan. Ujian Go harus dilaksanakan dengan kerap, ia dijalankan secara automatik semasa CI/CD dan sebelum dikeluarkan. Kebanyakan IDE juga akan menjalankan ujian yang disimpan secara automatik.

Helah lain yang boleh anda gunakan: Jika nil 指针没有意义,请编写一个使用非指针类型的 API。当然这有其缺点(有时指针是必须的);如果使用指针更有意义,请使用它,但检查 nil 值,并正确处理它们(例如返回 error,如果有意义则恐慌等)。还要编写测试来使用 nil penunjuk tidak masuk akal, tulis API yang menggunakan jenis bukan penuding. Sudah tentu ini mempunyai kelemahannya (kadangkala penunjuk diperlukan); jika menggunakan penuding lebih masuk akal, gunakannya, tetapi semak nilai

dan kendalikannya dengan betul (cth. kembalikan ralat, atau panik jika itu tunggu masuk akal). Tulis juga ujian untuk menguji menggunakan 🎜 nilai penunjuk. 🎜

Atas ialah kandungan terperinci Bolehkah saya mendapat ralat kompilasi dengan potensi dereference null ptr dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam