Memahami Gelagat Penetap untuk Struktur
Artikel ini menangani salah faham biasa yang dihadapi semasa menggunakan fungsi penetap untuk jenis struct dalam Go. Walaupun menggunakan fungsi penetap, nilai struct kekal tidak berubah, manakala fungsi penetap penunjuk berjaya mengubah suai struct.
Penetap Tanpa Penunjuk
Apabila struct diluluskan oleh nilai kepada fungsi, salinan struct dibuat dalam fungsi. Akibatnya, sebarang pengubahsuaian yang dibuat pada struct yang disalin dalam fungsi tidak ditunjukkan dalam struct asal di luar fungsi. Tingkah laku ini ditunjukkan dalam kod berikut:
type T struct { Val string } func (t T) SetVal(s string) { t.Val = s }
Dalam contoh ini, fungsi SetVal ditakrifkan sebagai kaedah T tanpa penerima penunjuk. Apabila anda memanggil SetVal pada struct v, salinan v dicipta dalam fungsi dan sebarang perubahan yang dibuat pada salinan tidak menjejaskan struct asal v. Ini kerana menghantar nilai mengikut nilai mencipta objek baharu sepenuhnya.
Penetap Dengan Penunjuk
Sebaliknya, apabila struct diluluskan melalui rujukan menggunakan penerima penunjuk, fungsi menerima penunjuk kepada struct asal, membolehkan pengubahsuaian kepada struct sebenar di luar fungsi. Tingkah laku ini digambarkan dalam kod berikut:
func (t *T) SetVal2(s string) { (*t).Val = s }
Dalam contoh ini, SetVal2 ditakrifkan sebagai kaedah T dengan penerima penunjuk. Apabila anda memanggil SetVal2 pada penunjuk struct, fungsi menerima penunjuk kepada struct asal, dan sebarang perubahan yang dibuat pada struct dalam fungsi mempengaruhi struct asal di luar fungsi. Ini kerana menghantar penunjuk melalui rujukan berkongsi alamat objek yang sama.
Kesimpulan
Perbezaan antara menghantar struct dengan nilai dan menghantar penunjuk struct sebagai hujah adalah penting apabila memahami kelakuan fungsi setter untuk struct dalam Go. Dengan mengenali perbezaannya, anda boleh mengubah suai struct dengan berkesan melalui fungsi setter seperti yang dimaksudkan.
Atas ialah kandungan terperinci Mengapa Beberapa Penetap Go Struct Gagal Mengubah Suai Struct Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!