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
Lepaskan: 2024-12-18 15:04:11
asal
840 orang telah melayarinya

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()
}
Salin selepas log masuk

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()
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan