Rumah >pembangunan bahagian belakang >Golang >Mengapa Kaedah My Go Struct Tidak Mengubah Suai Objek Asal?

Mengapa Kaedah My Go Struct Tidak Mengubah Suai Objek Asal?

DDD
DDDasal
2024-12-18 15:04:11847semak imbas

Why Does My Go Struct Method Not Modify the Original Object?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn