Mengapa saya tidak boleh menambahkan pada kepingan yang merupakan hak milik struct di Golang?
Di Golang, segala-galanya diluluskan oleh nilai , bermakna salinan objek dibuat apabila ia dihantar sebagai hujah kepada fungsi. Ini boleh membawa kepada gelagat yang tidak dijangka apabila cuba menambah pada kepingan yang merupakan sifat struktur.
Masalahnya: Ujian3
Pertimbangkan contoh berikut:
package main import "fmt" 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() { test3 := &Test3{} fmt.Println("Test3 final:", test3.run()) }
Apabila anda memanggil test3.run(), ia mencipta salinan test3 dan menghantarnya untuk dijalankan. Kaedah larian kemudian memanggil kombo, yang menambahkan dua nilai pada c.all. Walau bagaimanapun, apabila larian kembali, perubahan kepada c.all hilang kerana salinan test3 dibuang. Ini menyebabkan kepingan kosong dikembalikan, seperti yang dilihat dalam output:
Test3 step 1 [0] Test3 step 2 [0 1] Test3 final: []
Penyelesaian: Menggunakan Penerima Penunjuk
Untuk menyelesaikan isu ini, anda perlu untuk menggunakan penerima penunjuk untuk kaedah kombo. Ini memberitahu pengkompil untuk menghantar penuding kepada nilai Test3 dan bukannya salinan.
func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i+1, c.all) } }
Dengan penerima penuding, perubahan yang dibuat kepada c.all dalam kombo digunakan terus pada nilai Test3 asal, kerana ia diluluskan melalui rujukan. Ini menghasilkan output yang betul:
Test3 step 1 [0] Test3 step 2 [0 1] Test3 final: [0 1]
Dengan memahami konsep lulus mengikut nilai dan menggunakan penerima penunjuk dengan sewajarnya, anda boleh mengelakkan tingkah laku yang tidak dijangka apabila bekerja dengan kepingan dalam struct Golang.
Atas ialah kandungan terperinci Mengapakah penambahan pada kepingan dalam kaedah struktur Golang tidak berfungsi melainkan penerima penuding digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!