Mengembalikan Penunjuk pada Stack in Go: Didedahkan
Dalam pengaturcaraan C, mengembalikan penunjuk kepada pembolehubah yang diperuntukkan tindanan boleh membawa kepada isu , kerana memori dibuang selepas fungsi kembali. Walau bagaimanapun, dalam Go, mengembalikan penunjuk kepada pembolehubah yang dibuat tindanan bukan sahaja selamat tetapi juga amalan biasa.
Menggunakan analisis melarikan diri, Go secara automatik memperuntukkan nilai yang melarikan diri daripada tindanan (penunjuk yang mungkin dirujuk di luar skop semasa ) ke timbunan. Ini menghapuskan keperluan untuk mengambil berat tentang lokasi peruntukan pembolehubah.
Seperti yang dinyatakan dalam Soalan Lazim Go: "Bagaimana saya tahu sama ada pembolehubah diperuntukkan pada timbunan atau timbunan?":
if the compiler cannot prove that the variable is not referenced after the function returns, then the compiler must allocate the variable on the garbage-collected heap to avoid dangling pointer errors
Untuk melihat pilihan pengoptimuman pengkompil, gunakan pilihan -gcflags -m semasa penyusunan. Ini akan memberikan cerapan tentang cara Go mengurus peruntukan memori untuk senario yang berbeza.
Contoh:
Pertimbangkan kod Go berikut:
package main import ( "fmt" ) func main() { fmt.Println(*(something())) } func something() *string { s := "a" return &s }
In contoh ini, fungsi sesuatu mengembalikan penunjuk kepada pembolehubah yang diperuntukkan tindanan. Walau bagaimanapun, disebabkan oleh analisis melarikan diri Go, pengkompil mengiktiraf bahawa penunjuk yang dikembalikan digunakan di luar skop fungsi dan memperuntukkan pembolehubah pada timbunan. Ini memastikan bahawa penunjuk kekal sah dan tidak boleh dirujuk.
Atas ialah kandungan terperinci Adakah Mengembalikan Penunjuk yang Diperuntukkan Tindanan dalam Go Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!