Menggunakan Penetap Struktur: Memahami Kepentingan Penunjuk
Apabila bekerja dengan struct dalam Go, penggunaan penetap boleh mengubah suai sifat struct. Walau bagaimanapun, mungkin terdapat keadaan di mana pengubahsuaian yang diingini tidak ditunjukkan seperti yang diharapkan. Ini disebabkan oleh cara struct dihantar ke dalam fungsi.
Dalam kod contoh yang disediakan:
type T struct { Val string } func (t T) SetVal(s string) { t.Val = s } func (t *T) SetVal2(s string) { (*t).Val = s }
Fungsi SetVal yang disediakan tidak mengubah suai struct asal seperti yang dijangkakan kerana salinan struct diluluskan sebagai nilai ke dalam fungsi. Pengubahsuaian yang dibuat pada salinan ini tidak menjejaskan struct asal.
Sebagai alternatif, fungsi SetVal2 menjangkakan penunjuk kepada struct, membenarkan ia mengubah suai struct asal. Ini kerana Go menghantar penunjuk kepada struct mengikut nilai, bermakna fungsi menerima rujukan kepada lokasi memori yang sama seperti struct asal.
Untuk menunjukkan tingkah laku ini, pertimbangkan kod berikut:
v := T{"abc"} fmt.Println(v) // {abc} v.SetVal("pdq") fmt.Println(v) // {abc} v.SetVal2("xyz") fmt.Println(v) // {xyz}
Dalam contoh ini, struct v asal tidak diubah suai oleh SetVal, tetapi ia diubah suai oleh SetVal2. Ini terbukti dengan perbezaan dalam output.
Pengambilan utama ialah dalam Go, apabila menggunakan setter untuk struct, adalah penting untuk memahami perbezaan antara lulus dengan nilai dan lulus melalui penunjuk. Menggunakan penunjuk membenarkan fungsi mengubah suai struct asal, sambil menghantar nilai menghasilkan salinan struct dalam fungsi.
Atas ialah kandungan terperinci Mengapa Penetap Go Struct Memerlukan Penunjuk untuk Mengubah Suai Struktur Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!