Rumah >pembangunan bahagian belakang >Golang >Adakah golang semua rujukan?

Adakah golang semua rujukan?

PHPz
PHPzasal
2023-05-13 11:57:07416semak imbas

Golang ialah bahasa pengaturcaraan yang agak baharu yang telah menarik banyak perhatian dan kontroversi sejak ia dilahirkan. Salah satu topik ialah mengenai mekanisme rujukan berubah-ubah Golang. Di Golang, adakah semua itu menjadi rujukan? Isu ini melibatkan banyak aspek seperti falsafah reka bentuk bahasa Golang, paradigma pengaturcaraan, kaedah pengurusan memori, dll. Artikel ini akan meneroka mekanisme rujukan Golang dari perspektif ini.

Falsafah reka bentuk bahasa Golang

Sebelum membincangkan mekanisme rujukan Golang, kita perlu memahami falsafah reka bentuk bahasa Golang. Falsafah reka bentuk Golang adalah berdasarkan kesederhanaan, kecekapan dan kebolehbacaan, dan berusaha untuk memudahkan struktur dan peraturan bahasa sebanyak mungkin sambil menyediakan kefungsian yang mencukupi untuk menyokong pembangunan. Bagi mekanisme rujukan pembolehubah, Golang juga mengikut prinsip ini.

Mekanisme rujukan pembolehubah Golang

Di Golang, cara pembolehubah dirujuk bergantung pada jenis pembolehubah. Jenis pembolehubah di Golang terbahagi kepada dua kategori: jenis asas dan jenis komposit.

Jenis asas

Jenis asas merujuk kepada jenis data asas terbina dalam, seperti int, float, bool, rentetan, dsb. Di Golang, pembolehubah jenis asas diluluskan mengikut nilai, iaitu, apabila kita menetapkan nilai kepada pembolehubah jenis asas, nilai tersebut akan disalin terus ke alamat memori di mana pembolehubah itu berada.

Sebagai contoh, coretan kod berikut menunjukkan proses memberikan nilai kepada pembolehubah jenis int:

a := 1
b := a

Dalam proses ini, nilai 1 a disalin ke alamat memori baharu, Dan berikan alamat ini kepada pembolehubah b. Pada masa ini, a dan b masing-masing mempunyai alamat dan nilai bebas dalam ingatan, dan ia tidak menjejaskan satu sama lain.

Jenis komposit

Jenis komposit merujuk kepada jenis data komposit seperti tatasusunan, kepingan, struktur dan antara muka. Tidak seperti jenis primitif, pembolehubah jenis komposit biasanya diluluskan melalui rujukan dan menduduki lokasi yang berbeza dalam ingatan.

Untuk jenis tatasusunan dan kepingan, ia adalah penunjuk ke lokasi tertentu dalam ingatan, bukan data sebenar. Apabila kita memberikan nilai kepada pembolehubah jenis tatasusunan atau kepingan, kita sebenarnya menetapkan alamat memori yang ditunjuk oleh pembolehubah ini kepada pembolehubah baharu. Kaedah ini dipanggil salinan cetek, kerana pembolehubah baru hanya menunjuk ke alamat memori pembolehubah asal, bukannya salinan benar.

Sebagai contoh, kod berikut menunjukkan proses memberikan nilai kepada pembolehubah jenis kepingan:

a := []int{1, 2, 3}
b := a

Dalam proses ini, alamat memori yang ditunjuk oleh pembolehubah a ialah tatasusunan panjang 3 , dan kandungannya ialah 1, 2, 3. Apabila kita menetapkan a kepada pembolehubah b, kita sebenarnya menunjukkan pembolehubah b ke alamat yang sama, iaitu, a dan b kini berkongsi alamat memori yang sama. Oleh itu, apabila kita mengubah suai elemen dalam a atau b, elemen sepadan dalam pembolehubah lain juga akan berubah. Cara perkongsian memori ini mungkin mempunyai hasil yang tidak dijangka untuk sesetengah aplikasi, jadi pengaturcara perlu berhati-hati.

Untuk jenis struktur, pembolehubah biasanya diluluskan mengikut nilai, maksudnya, apabila kita menetapkan nilai kepada pembolehubah jenis struktur, nilai keseluruhan struktur akan disalin, dan Bukan hanya penunjuk. kepadanya. Kaedah penyalinan ini dipanggil salinan dalam kerana ia menyalin secara rekursif pembolehubah lain yang bersarang dalam struktur sehingga semua nod anak telah disalin.

Sebagai contoh, kod berikut menunjukkan proses memberikan nilai kepada pembolehubah jenis struktur:

type person struct {
    name string
    age int
}
a := person{"tom", 20}
b := a

Dalam proses ini, pembolehubah a ialah pembolehubah jenis struktur, termasuk nama pembolehubah ahli dan umur. Apabila kita menetapkan pembolehubah a kepada pembolehubah b, nilai keseluruhan struktur akan disalin Maksudnya, b kini mengandungi struktur baharu di mana nilai pembolehubah ahli adalah sama dengan a, tetapi ia berbeza. pada alamat ingatan.

Untuk jenis antara muka, cara pembolehubah dirujuk bergantung pada jenis nilai yang sebenarnya disimpan di dalam pembolehubah antara muka. Jika nilai yang disimpan adalah jenis primitif, ia akan diluluskan oleh nilai jika ia adalah jenis penunjuk, ia akan diluluskan melalui rujukan.

Pengurusan Memori

Di Golang, pengurusan memori diselesaikan oleh pemungut sampah. Pengumpul sampah secara automatik menjejaki semua memori yang diperuntukkan dan menuntut semula serta membebaskannya apabila diperlukan. Pendekatan ini membantu mengelakkan kebocoran memori dan operasi memori yang salah, tetapi ia juga mempunyai kesan tertentu terhadap prestasi.

Untuk jenis pembolehubah primitif, pengurusan memori adalah agak mudah kerana ia diluluskan oleh nilai. Apabila pembolehubah keluar dari skop, memori yang mereka duduki dikeluarkan secara automatik.

Untuk pembolehubah jenis komposit, pengurusan memori agak rumit kerana ia biasanya diluluskan melalui rujukan. Apabila pembolehubah keluar dari skop, tidak cukup dengan hanya melepaskan memori yang diduduki oleh pembolehubah itu sendiri. Kita juga perlu merentasi semua alamat memori yang ditunjukkan satu demi satu dan melepaskannya secara rekursif. Proses ini diselesaikan oleh pemungut sampah, dan pengaturcara tidak perlu mengendalikannya sendiri.

Ringkasan

Mekanisme rujukan pembolehubah Golang bergantung pada jenis pembolehubah yang dihantar mengikut nilai, manakala jenis komposit biasanya diluluskan melalui rujukan. Peraturan ini merupakan bahagian penting dalam falsafah reka bentuk Golang, yang secara berkesan memudahkan struktur dan peraturan bahasa. Dengan mematuhi peraturan ini dengan tegas dan menggunakan pemungut sampah untuk mengurus memori secara automatik, kami boleh menjimatkan banyak masa dan tenaga serta lebih memfokuskan pada logik dan pelaksanaan fungsi program.

Atas ialah kandungan terperinci Adakah golang semua rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn