Rumah > pembangunan bahagian belakang > Golang > Tingkah laku pelik tambahan dalam Go

Tingkah laku pelik tambahan dalam Go

王林
Lepaskan: 2024-02-02 14:13:26
ke hadapan
1105 orang telah melayarinya

Go 中追加的奇怪行为

Kandungan soalan

Saya cuba menyelesaikan masalah subset pada LeetCode menggunakan Go. Saya datang dengan penyelesaian berikut:

func subsets(nums []int) [][]int {
    sol := make([][]int,0)
    temp:= make([]int,0)

    var backtrack func(idx int)
    backtrack = func(idx int) {
        sol = append(sol, temp)
        fmt.Println(temp, append([]int{},temp...))

        if idx == len(nums) {
            return
        }

        for i:= idx; i<len(nums);i++{
            temp = append(temp,nums[i])
            backtrack(i+1)
            temp = temp[:len(temp)-1]
        }

    }
    backtrack(0)
    return sol

}
Salin selepas log masuk

Namun, penyelesaian ini tidak betul. Saya perasan bahawa saya perlu menggunakan append(sol,append([]int{},temp...)) dan bukannya sol=append(sol,temp).

Walaupun pernyataan fmt.Println(temp,append([]int{}, temp...)) menjana output yang sama untuk temp dan append([]int{}, temp...), gunakan append([ ]int {}, temp...) sebenarnya berfungsi. Bolehkah seseorang menerangkan perbezaan antara temp dan append([]int{}, temp...) dalam kes ini? Mengapakah versi yang diperbetulkan berfungsi tetapi versi awal tidak?

Dijangkakan bahawa temp dan append([]int{},temp...) adalah samatempappend([]int{},temp...) 相同


正确答案


sol =append(sol, temp) 的问题是您将切片 temp 添加到 sol

Jawapan yang betul

Masalah dengan sol =append(sol, temp) ialah anda menambah kepingan temp pada sol dan bukannya item "di dalam" kepingan. Seperti yang dinyatakan dalam

Slice internal blog posttemp 在每次迭代中重用,因此 temp 切片下的数组内容将被覆盖,并且您之前添加到 sol 的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 fmt.Println 语句显示在附加之前, temp, slice ialah "hanya" penunjuk kepada tatasusunan, panjang dan kapasitinya.

Jadi, dalam kes anda, kerana append([]int{}, temp...) mempunyai nilai yang betul.

🎜Apabila 🎜 mencipta kepingan baharu, nilai dalam kepingan baharu tidak boleh berubah kerana ia tidak digunakan semula. 🎜

Atas ialah kandungan terperinci Tingkah laku pelik tambahan dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan