Maison  >  Article  >  développement back-end  >  Quelle est la différence entre `array` et `slice{array,array,...}` en Golang ?

Quelle est la différence entre `array` et `slice{array,array,...}` en Golang ?

WBOY
WBOYavant
2024-02-08 23:10:101145parcourir

Golang 中 `array` 和 `slice{array,array,...}` 有什么区别?

Quelle est la différence entre `array` et `slice{array,array,...}` en Golang ? C’est une question souvent posée par de nombreux débutants. L'éditeur PHP Zimo répondra pour vous : En Golang, `array` est une séquence de longueur fixe. Une fois définie, la longueur ne peut pas être modifiée. « slice » est une séquence de longueur dynamique qui peut être étendue ou réduite selon les besoins. De plus, la longueur du « tableau » est déterminée au moment de la définition, tandis que la longueur de la « tranche » peut être modifiée dynamiquement au moment de l'exécution. Par conséquent, lors de son utilisation, vous devez choisir une structure de données appropriée en fonction des besoins réels.

Contenu de la question

J'aimerais savoir pourquoi, merci de me donner un indice.

Je souhaite ajouter un tableau à res中,resqui est une tranche 2D. Je dois donc d'abord me convertir. Lorsque je convertis le tableau en tranche, j'obtiens une erreur.

// i need a map to remove duplicates
mm := map[[3]int]bool{}
mm[[3]int{-1, -1, 2}] = true
mm[[3]int{-1, -1, 2}] = true
mm[[3]int{-1, 0, 1}] = true

var res [][]int
for k, _ := range mm {
    res = append(res, k[:])
}
fmt.printf("the res is %v\n", res)
the res is [[-1 0 1] [-1 0 1]]

Mais le résultat n'est pas celui que je souhaite.

Ensuite, j'ai provisoirement modifié la boucle for

for k, _ := range mm {
    //res = append(res, k[:])
    res = append(res, []int{k[0], k[1], k[2]})
}
the res is [[-1 0 1] [-1 -1 2]]

Maintenant, le résultat est correct, mais pourquoi ? k[:][]int{k[0],k[1],k[2]} Quelle est la différence ?

Solution

Changez la boucle en

for k, _ := range mm {
    j := k
    res = append(res, j[:])
}

Votre boucle d'origine déclare une variable de type [3]int 的变量 k,该变量在内存中具有特定位置。循环的每次迭代,都会将映射 mm dans laquelle une clé différente est copiée. Jusqu'ici, tout va bien.

Lorsque vous utilisez k[:] 将其转换为切片时,它会创建一个切片标头,指向数组 k。这里出错了 - 循环的下一次迭代,k 的值被覆盖。循环中创建的所有切片都指向内存中同一位置的同一支持数组 k.

Vous évitez le problème en donnant à chaque tranche son propre tableau de support en copiant d'abord la valeur de k dans une variable déclarée à l'intérieur de la boucle.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer