Dalam Go, struct diluluskan mengikut nilai, yang bermaksud bahawa sebarang perubahan yang dibuat pada struct dalam fungsi tidak ditunjukkan dalam struct asal. Ini boleh menjadi masalah apabila anda ingin mengubah suai medan struct dalam fungsi.
Pertimbangkan kod berikut:
type Point struct { x, dx int } func (s Point) Move() { s.x += s.dx log.Printf("New X=%d", s.x) } func (s Point) Print() { log.Printf("Final X=%d", s.x) } func main() { st := Point{ 3, 2 }; st.Move() st.Print() }
Dalam kod ini, kaedah Move cuba mengubah suai x medan struct Point, tetapi kerana struct diluluskan oleh nilai, perubahan yang dibuat pada struct dalam kaedah Move tidak ditunjukkan dalam struct asal. Akibatnya, kaedah Cetak mengeluarkan nilai asal bagi x (3), bukan nilai yang dikemas kini (5).
Untuk menyelesaikan isu ini, kita perlu menghantar struct Point dengan penunjuk kepada kaedah Move. Dengan menghantar struct dengan penuding, kami menghantar rujukan kepada struct asal, jadi sebarang perubahan yang dibuat pada struct dalam kaedah Move akan ditunjukkan dalam struct asal.
Berikut ialah kod yang diperbetulkan:
type Point struct { x, dx int } func (s *Point) Move() { s.x += s.dx log.Printf("New X=%d", s.x) } func (s *Point) Print() { log.Printf("Final X=%d", s.x) } func main() { st := Point{ 3, 2 }; st.Move() st.Print() }
Dengan perubahan ini, kaedah Move mengubah suai medan x struct Point dengan betul dan kaedah Cetak mengeluarkan nilai x yang dikemas kini. (5).
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengubah suai Medan Struktur dalam Fungsi Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!