Rumah > pembangunan bahagian belakang > Golang > Mengapa Tidak Mengubah Suai Medan Go Struct dalam Kaedah Penerima Nilai Mengubah Nilai Asal?

Mengapa Tidak Mengubah Suai Medan Go Struct dalam Kaedah Penerima Nilai Mengubah Nilai Asal?

DDD
Lepaskan: 2024-12-15 17:16:18
asal
116 orang telah melayarinya

Why Doesn't Modifying a Go Struct Field in a Value Receiver Method Change the Original Value?

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

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

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!

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