Rumah >pembangunan bahagian belakang >Golang >Mengapakah fungsi utama Go termasuk gelung tak terhingga dan penyimpangan nol yang nampaknya sia-sia?
Dalam fungsi utama pustaka masa jalan Go (src/runtime/proc. go), wujud gelung tak terhingga yang kelihatan tidak bertujuan. Coretan kod pelik ini:
<code class="go"> exit(0) for { var x *int32 *x = 0 }</code>
telah membingungkan ramai pembangun. Mengapakah gelung ini wujud dan apakah tujuannya?
Dalam sistem dengan unit perlindungan memori (MPU), memberikan 0 kepada rantau memori yang dilindungi (seperti (int)(nil) atau *x dalam coretan kod di atas) menyebabkan ralat pembahagian, menghentikan program dengan berkesan. Walau bagaimanapun, dalam sistem tanpa MPU, menulis 0 kepada alamat memori sifar tidak menghasilkan kesan yang boleh dilihat.
Untuk menangani isu ini, pembangun Go menambah gelung infinite for . Tujuan utamanya adalah untuk menghentikan program apabila panggilan keluar gagal. Memandangkan fungsi keluar tidak berjaya menamatkan program, ada kemungkinan bahawa tiada rujukan boleh berfungsi. Dan sekiranya gagal juga, gelung memastikan program kekal dalam keadaan terbiar.
Gelung tak terhingga dianggap "kod tidak boleh dicapai" dalam keadaan biasa. Ia bertujuan untuk berfungsi sebagai mekanisme failsafe, dicetuskan hanya apabila sesuatu yang tidak dijangka berlaku. Kenyataan pembangun dalam kod sumber menangkap intipati tujuannya:
"Jika gelung itu pernah dicapai, sesuatu telah berlaku dengan teruk: panggilan keluar sepatutnya menyebabkan atur cara keluar."
Situasi yang sama timbul apabila panik dipanggil dalam Go. Di dalam src/runtime/panic.go, pada akhir func fatalpanic(msgs *_panic), satu lagi coretan "kod tidak boleh dicapai" wujud:
<code class="go"> systemstack(func() { exit(2) }) *(*int)(nil) = 0 // not reached</code>
Jika panik dicetuskan semasa penyusunan (seperti yang digambarkan dalam menyediakan kod sumber), fungsi fatalpanik digunakan. Walau bagaimanapun, fungsi keluar mungkin gagal untuk menamatkan program, mendorong pelaksanaan bahagian "kod tidak boleh dicapai". Penyahrujukan nil ((int)(nil) = 0) kemudian mencetuskan pelanggaran segmentasi, menghentikan program dengan berkesan.
Gelung dan gelung tak terhingga yang kelihatan sia-sia tiada rujukan dalam perpustakaan masa jalan Go berfungsi sebagai jaring keselamatan untuk mengurus senario luar biasa di mana penamatan program melalui panggilan keluar gagal. Mereka memastikan program dihentikan walaupun keadaan tidak dijangka berlaku, menjaga kestabilan sistem.
Atas ialah kandungan terperinci Mengapakah fungsi utama Go termasuk gelung tak terhingga dan penyimpangan nol yang nampaknya sia-sia?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!