Bahasa pengaturcaraan memperuntukkan objek dalam ingatan, dan berbeza bahasa menggunakan strategi yang berbeza untuk melakukan ini. Dalam C, pembolehubah yang diperuntukkan tindanan berada pada tindanan, manakala memori yang diperuntukkan timbunan diperuntukkan secara dinamik. Python, sebaliknya, memperuntukkan semua objek pada timbunan, menggunakan rujukan untuk mengaksesnya.
Pendekatan Go terhadap peruntukan memori berbeza daripada C dan Python. Walaupun Go tidak menyatakan secara eksplisit tempat objek diperuntukkan, ia menggunakan pengumpulan sampah untuk menuntut semula memori yang tidak digunakan. Ini menimbulkan persoalan tentang cara struct, yang merupakan jenis komposit, diperuntukkan dalam Go.
Pertimbangkan dua fungsi berikut, yang kelihatan melaksanakan tugas yang sama:
func myFunction() (*MyStructType, error) { var chunk *MyStructType = new(HeaderChunk) ... return chunk, nil } func myFunction() (*MyStructType, error) { var chunk MyStructType ... return &chunk, nil }
Fungsi sampel ini menimbulkan beberapa soalan:
Dalam Go, tindanan digunakan untuk menyimpan argumen fungsi, pembolehubah setempat dan pulangan nilai. Timbunan digunakan untuk memperuntukkan objek yang telah dibuat menggunakan baharu atau yang telah terlepas daripada timbunan.
Dalam fungsi pertama, bongkah diperuntukkan pada timbunan menggunakan baharu. Dalam fungsi kedua, analisis escape Go menentukan bahawa &chunk melarikan diri daripada timbunan, jadi ia juga diperuntukkan pada timbunan.
Walaupun bongkah diperuntukkan pada timbunan dalam fungsi kedua, pengumpul sampah Go memastikan ia kekal boleh diakses selepas fungsi itu kembali. Ini kerana analisis melarikan diri menentukan bahawa bongkah terlepas daripada skop fungsi, dan pengumpul sampah tidak akan menuntutnya semula selagi ia dirujuk oleh objek lain.
Struktur diluluskan mengikut nilai dalam Go kerana ia adalah jenis komposit. Melepasi penuding sebaliknya akan membenarkan penerima untuk mengubah suai struct asal. Dalam kes fungsi kedua, bongkah diperuntukkan pada timbunan, jadi tidak perlu menghantar penunjuk kepadanya. Walau bagaimanapun, penunjuk digunakan apabila pemanggil perlu mengakses struct yang telah diperuntukkan pada timbunan.
Atas ialah kandungan terperinci Bagaimana Go Mengendalikan Stack vs. Longgokan Peruntukan Struktur, dan Apakah Peranan yang Dimainkan oleh Kutipan Sampah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!