Maison > Article > développement back-end > Comportement étrange de l'ajout dans Go
J'essaie de résoudre le problème de sous-ensemble sur LeetCode en utilisant Go. J'ai trouvé la solution suivante :
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 }
Cependant, cette solution est incorrecte. J'ai remarqué que je devais utiliser append(sol,append([]int{},temp...)) au lieu de simplement sol=append(sol,temp).
Même si l'instruction fmt.Println(temp,append([]int{}, temp...)) génère la même sortie pour temp et append([]int{}, temp...), utilisez append([ ]int {}, temp...) fonctionne réellement. Quelqu'un peut-il expliquer la différence entre temp et append([]int{}, temp...) dans ce cas ? Pourquoi la version corrigée fonctionne-t-elle mais pas la version initiale ?
On s'attend à ce que temp
et append([]int{},temp...)
soient identiquestemp
和 append([]int{},temp...)
相同
sol =append(sol, temp)
的问题是您将切片 temp
添加到 sol
Bonne réponse
sol =append(sol, temp)
est que vous ajoutez la tranche temp
au sol
au lieu du élément "à l'intérieur" de la tranche. Comme mentionné dans le Article de blog interne de Slicetemp
在每次迭代中重用,因此 temp
切片下的数组内容将被覆盖,并且您之前添加到 sol
的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 fmt.Println
语句显示在附加之前, temp
, une tranche est "juste" un pointeur vers un tableau, sa longueur et sa capacité.
Donc, dans votre cas, puisque append([]int{}, temp...)
a la bonne valeur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!