Menetapkan Nilai Baharu pada Medan Struktur
Pertimbangkan senario berikut: Kelas Point ditakrifkan dengan kaedah Move() yang melaraskan x koordinat dan kaedah Print() untuk memaparkan hasil. Walau bagaimanapun, kod tersebut mempamerkan tingkah laku yang tidak dijangka, memaparkan nilai x awal dan bukannya nilai yang dilaraskan selepas memanggil Move().
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() }
Isu ini berpunca daripada fakta bahawa Move() ditakrifkan sebagai penerima nilai, bermakna ia beroperasi pada salinan objek Titik asal. Oleh itu, pengubahsuaian kepada s dalam Move() tidak mempunyai kesan ke atas kejadian sebenar.
Untuk menyelesaikan masalah ini, kaedah Move() harus ditakrifkan sebagai penerima penunjuk, membenarkannya berinteraksi secara langsung dengan objek asal:
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() }
Sekarang, apabila Move() dipanggil, pembolehubah s menghala ke objek Titik asal, jadi perubahan kepada s.x menjejaskan kejadian secara langsung. Akibatnya, memanggil Print() selepas Move() memaparkan koordinat x yang dikemas kini dengan betul.
Atas ialah kandungan terperinci Mengapa Kaedah My Go Struct Tidak Mengubah Suai Objek Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!