Rumah > pembangunan bahagian belakang > Golang > Mengapakah penambahan pada kepingan dalam kaedah struktur Golang tidak berfungsi melainkan penerima penuding digunakan?

Mengapakah penambahan pada kepingan dalam kaedah struktur Golang tidak berfungsi melainkan penerima penuding digunakan?

Linda Hamilton
Lepaskan: 2024-12-31 15:09:10
asal
440 orang telah melayarinya

Why doesn't appending to a slice within a Golang struct method work unless a pointer receiver is used?

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

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: []
Salin selepas log masuk

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

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]
Salin selepas log masuk

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!

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