Memori untuk fungsi dalam Go diluluskan oleh nilai dan tidak menjejaskan pembolehubah asal. Goroutine berkongsi memori, dan memori yang diperuntukkan olehnya tidak akan dituntut semula oleh GC sehingga Goroutine menyelesaikan pelaksanaan. Kebocoran memori boleh berlaku dengan memegang rujukan kepada Goroutine yang telah lengkap, menggunakan pembolehubah global atau mengelakkan pembolehubah statik. Untuk mengelakkan kebocoran, adalah disyorkan untuk membatalkan Goroutines melalui saluran, mengelakkan pembolehubah statik dan menggunakan penyataan tangguh untuk mengeluarkan sumber.
Pengurusan memori bahasa Go adalah automatik, dan pengumpul sampah (GC) terbina dalam akan mengitar semula objek yang tidak digunakan lagi. Fungsi dan Goroutine adalah bahagian penting dalam pengurusan memori, dan adalah penting untuk memahami tingkah laku ingatan mereka.
Memori dalam fungsi Go diluluskan oleh nilai. Ini bermakna apabila pembolehubah diluluskan sebagai parameter fungsi, ia disalin ke pembolehubah tempatan dalam fungsi. Oleh itu, sebarang perubahan yang dibuat pada parameter fungsi tidak akan menjejaskan pembolehubah asal.
func increment(n int) { n++ // 不会影响原始变量的值 } func main() { x := 5 increment(x) fmt.Println(x) // 仍然输出 5 }
Tidak seperti fungsi, Goroutines dilaksanakan serentak dan berkongsi memori aplikasi. Memori yang diperuntukkan dalam Goroutine tidak akan dituntut semula oleh GC sehingga Goroutine menyelesaikan pelaksanaan.
func runGoroutine() { for { // 永远运行,内存泄漏 fmt.Println("Goroutine 正在运行...") } } func main() { go runGoroutine() time.Sleep(time.Second) // 应用不会退出,因 Goroutine 仍在运行 }
Situasi berikut mungkin menyebabkan kebocoran ingatan:
Amalan terbaik untuk mengelakkan kebocoran ingatan:
tunda
: defer
:使用 defer
Gunakan pernyataan tunda
untuk menutup sumber (seperti pemegang fail) untuk memastikan sumber akan dikeluarkan walaupun pengecualian berlaku. Atas ialah kandungan terperinci Pengurusan memori fungsi golang dan goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!