Heim > Artikel > Backend-Entwicklung > Seltsames Verhalten des Anhängens in Go
Ich versuche, das Teilmengenproblem auf LeetCode mit Go zu lösen. Ich habe mir folgende Lösung ausgedacht:
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 }
Diese Lösung ist jedoch falsch. Mir ist aufgefallen, dass ich append(sol,append([]int{},temp...)) statt nur sol=append(sol,temp) verwenden muss.
Obwohl die fmt.Println(temp,append([]int{}, temp...))-Anweisung die gleiche Ausgabe für temp und append([]int{}, temp...) generiert, verwenden Sie append([ ]int {}, temp...) funktioniert tatsächlich. Kann jemand in diesem Fall den Unterschied zwischen temp und append([]int{}, temp...) erklären? Warum funktioniert die korrigierte Version, die ursprüngliche Version jedoch nicht?
Es wird erwartet, dass temp
und append([]int{},temp...)
gleich sindtemp
和 append([]int{},temp...)
相同
sol =append(sol, temp)
的问题是您将切片 temp
添加到 sol
Richtige Antwort
sol =append(sol, temp)
besteht darin, dass Sie das Slice temp
zum sol
anstelle des hinzufügen Element „innerhalb“ des Slice. Wie im Slice-internen Blogbeitragtemp
在每次迭代中重用,因此 temp
切片下的数组内容将被覆盖,并且您之前添加到 sol
的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 fmt.Println
语句显示在附加之前, temp
erwähnt, ist ein Slice „nur“ ein Zeiger auf ein Array, seine Länge und Kapazität.
In Ihrem Fall also, da append([]int{}, temp...)
den richtigen Wert hat.
Das obige ist der detaillierte Inhalt vonSeltsames Verhalten des Anhängens in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!