Rumah >pembangunan bahagian belakang >Golang >Mengapa Tidak Mengubah Suai Medan Go Struct dalam Kaedah Penerima Nilai Mengubah Nilai Asal?
Menetapkan Nilai Baharu kepada Medan Struktur
Dalam Go, apabila berurusan dengan struktur, adalah penting untuk memahami konsep penerima nilai berbanding penerima penunjuk. Penerima nilai beroperasi pada salinan nilai asal, manakala penerima penuding beroperasi secara langsung pada nilai asal.
Pertimbangkan coretan kod ini, di mana soalan dibangkitkan tentang nilai medan struct yang tidak diduga tidak berubah:
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() }
Jangkaan ialah kaedah Move() mengubah suai medan x struct Point, yang sepatutnya ditunjukkan dalam Kaedah cetak (). Walau bagaimanapun, output menunjukkan bahawa medan x kekal tidak berubah.
Penyelesaian: Menggunakan Penerima Penunjuk
Isunya terletak pada penggunaan penerima nilai dalam Move( ) dan kaedah Print(). Dalam Go, semuanya diluluskan oleh nilai, bermakna salinan nilai asal dibuat apabila menghantar struct kepada fungsi. Oleh itu, sebarang pengubahsuaian yang dibuat pada salinan dalam fungsi tidak menjejaskan nilai asal.
Untuk menyelesaikannya, kita perlu menggunakan penerima penunjuk. Penerima penunjuk membenarkan fungsi beroperasi secara langsung pada nilai 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 menggunakan penerima penuding untuk kaedah Move() dan Print(), kami kini beroperasi terus pada struct Point asal, dan perubahan pada medan x dicerminkan dengan betul .
Atas ialah kandungan terperinci Mengapa Tidak Mengubah Suai Medan Go Struct dalam Kaedah Penerima Nilai Mengubah Nilai Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!