Rumah > pembangunan bahagian belakang > Golang > Mengapa Kaedah Penetapan Struktur Go Berkelakuan Berbeza Apabila Menggunakan Penerima Nilai berbanding Penunjuk?

Mengapa Kaedah Penetapan Struktur Go Berkelakuan Berbeza Apabila Menggunakan Penerima Nilai berbanding Penunjuk?

Linda Hamilton
Lepaskan: 2024-12-24 20:08:17
asal
125 orang telah melayarinya

Why Do Go's Struct Setter Methods Behave Differently When Using Value vs. Pointer Receivers?

Memahami Kaedah Penetap untuk Jenis Struktur

Jenis struktur dalam Go menyediakan cara yang mudah untuk mengumpulkan data berkaitan, dan kaedah penetap membenarkan kami mengubah suai harta benda mereka. Walau bagaimanapun, senario tertentu boleh membawa kepada tingkah laku yang tidak dijangka.

Penerangan Masalah:

Pertimbangkan struct T dengan medan Val dan dua fungsi penetap: SetVal dan SetVal2. Menggunakan SetVal tidak mengubah suai struktur asal, manakala SetVal2 melakukannya. Memahami percanggahan ini adalah penting.

Mekanisme Asas:

Apabila menghantar struct kepada fungsi, dua pendekatan boleh dilakukan:

  • Melalui Nilai: Mencipta salinan struct. Sebarang pengubahsuaian yang dibuat dalam fungsi hanya menjejaskan salinan.
  • Melalui Rujukan (Penunjuk): Menyediakan penunjuk kepada struct asal, membenarkan pengubahsuaian berterusan.

Penaakulan:

SetVal mengambil struct sebagai parameter nilai. Oleh itu, salinan struct dibuat dalam fungsi, dan sebarang perubahan kepada t (salinan) tidak memberi kesan kepada v asal.

Menyelesaikan Isu:

Gunakan pendekatan penerima penunjuk dalam SetVal2 untuk memastikan pengubahsuaian ditunjukkan dalam asal struct:

func (t *T) SetVal(s string) {
    t.Val = s
}
Salin selepas log masuk

Pengesahan:

Menambah pernyataan cetakan untuk menunjukkan perbezaan:

type T struct { Val string }

func (t T) SetVal(s string) {
    fmt.Printf("Address of copy is %p\n", &t)
}

func (t *T) SetVal2(s string) {
    fmt.Printf("Pointer argument is %p\n", t)
}

func main() {
    v := T{"abc"}
    fmt.Printf("Address of v is %p\n", &v)
    v.SetVal("pdq")
    v.SetVal2("xyz")
}
Salin selepas log masuk

Program ini mengeluarkan:

Address of v is 0xf8400cfc00
Address of copy is 0xf8400cfcd0
Pointer argument is 0xf8400cfc00
Salin selepas log masuk

Alamat v dan penuding dalam SetVal2 adalah sama, mengesahkan penggunaan yang asal struct, manakala SetVal berfungsi pada salinan.

Atas ialah kandungan terperinci Mengapa Kaedah Penetapan Struktur Go Berkelakuan Berbeza Apabila Menggunakan Penerima Nilai berbanding Penunjuk?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan