Maison > développement back-end > Golang > Comportement étrange de l'ajout dans Go

Comportement étrange de l'ajout dans Go

王林
Libérer: 2024-02-02 14:13:26
avant
1047 Les gens l'ont consulté

Go 中追加的奇怪行为

Contenu de la question

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

}
Copier après la connexion

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 identiquestempappend([]int{},temp...) 相同


正确答案


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

Bonne réponse

Le problème avec 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.

🎜Lorsque 🎜 crée une nouvelle tranche, la valeur de la nouvelle tranche ne peut pas changer car elle n'est pas réutilisée. 🎜

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal