Rumah >pembangunan bahagian belakang >Golang >Mengapakah Saya Memerlukan Penerima Penunjuk untuk Dipasang pada Slice dalam Go Struct?
Melampirkan pada Slice Properties dalam Go Structs
Apabila cuba menambahkan nilai pada slice property dalam Go struct, anda mungkin menghadapi gelagat yang tidak dijangka jika perintah panggilan tertentu tidak diikuti. Artikel ini meneroka sebab di sebalik isu ini dan menyediakan penyelesaian.
Dalam contoh kod yang disediakan, tiga kaedah ditakrifkan dalam jenis struct yang berbeza untuk menunjukkan isu tersebut. Test1 dan Test2 berfungsi seperti yang diharapkan kerana kaedah run() mereka beroperasi secara langsung pada sifat slice. Walau bagaimanapun, dalam Test3, kaedah kombo() dipanggil daripada run() menggunakan penerima nilai dan bukannya penerima penunjuk.
Mengapa Penerima Penunjuk Diperlukan
Dalam Go, semua nilai dihantar mengikut nilai, bermakna salinan nilai yang diluluskan dibuat apabila memanggil fungsi atau kaedah. Dalam kes Test3, salinan nilai Test3 dibuat apabila combo() dipanggil dan pengubahsuaian pada sifat slice dalam salinan ini tidak ditunjukkan dalam struct Test3 asal.
Dengan menggunakan penerima penuding , seperti func (c *Test3) combo(), struct Test3 asal diubah suai secara langsung, menghapuskan isu copy-local perubahan.
Penyelesaian
Penyelesaian adalah untuk menukar jenis penerima kaedah kombo() kepada penerima penunjuk. Ini memastikan bahawa struct Test3 asal sedang diubah suai oleh kaedah.
Kod Kemas Kini
package main import ( "fmt" ) type Test1 struct { all []int } func (c Test1) run() []int { for i := 0; i < 2; i++ { c.all = append(c.all, i) } return c.all } var gloabl_all []int type Test2 struct {} func (c Test2) run() []int { c.combo() return gloabl_all } func (c Test2) combo() { for i := 0; i < 2; i++ { gloabl_all = append(gloabl_all, i) } } type Test3 struct { all []int } func (c Test3) run() []int { c.combo() return c.all } func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i + 1, c.all) } } func main() { test1 := &Test1{} fmt.Println("Test1 final:", test1.run()) test2 := &Test2{} fmt.Println("Test2 final:", test2.run()) test3 := &Test3{} fmt.Println("Test3 final:", test3.run()) }
Output
Test1 final: [0 1] Test2 final: [0 1] Test3 step 1 [0] Test3 step 2 [0 1] Test3 final: [0 1]
Atas ialah kandungan terperinci Mengapakah Saya Memerlukan Penerima Penunjuk untuk Dipasang pada Slice dalam Go Struct?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!