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
DDDasal
2024-12-15 17:16:18118semak imbas

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()
}

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!

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