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 ? 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.
J'aimerais savoir pourquoi, merci de me donner un indice.
Je souhaite ajouter un tableau à res
中,res
qui 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 ?
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!