Comprendre le comportement de append() sur les tranches
Malgré les hypothèses initiales de slice en tant que pointeur, le code fourni démontre que l'ajout () l’opération n’affecte pas directement la tranche d’origine. En effet, dans Go, tout est transmis par valeur, y compris les tranches. Ainsi, lorsque vous transmettez une tranche à une fonction ou l'attribuez à une nouvelle variable, vous ne transmettez qu'une copie de l'en-tête de la tranche.
L'en-tête de la tranche contient des informations telles que la longueur de la tranche, sa capacité, et un pointeur vers le tableau sous-jacent. Lorsque l'opération append() est effectuée sur une tranche, un nouveau tableau est alloué si nécessaire pour accueillir les nouveaux éléments. L'en-tête de tranche est ensuite mis à jour pour pointer vers le nouveau tableau et les nouveaux éléments sont copiés. Ce nouvel en-tête de tranche est renvoyé à la suite de l'appel append().
Dans l'exemple de code, vous attribuez la valeur de retour de l'opération append() à la variable slice1. Cela signifie que slice1 pointe désormais vers un tableau différent de slice. Toute modification apportée aux éléments de slice1 ne sera pas reflétée dans slice, et vice versa.
Pour obtenir le comportement où slice et slice1 font référence au même tableau, vous devrez utiliser un pointeur vers une tranche au lieu d'une tranche elle-même. Par exemple :
func main() { slice := make([]int, 10, 10) slice[0] = 0 slice[1] = 1 slicePtr := &slice slice1 := *slicePtr slice1[0] = 10000 fmt.Println(slice) *slicePtr = append(*slicePtr, 100) (*slicePtr)[0] = 20000 fmt.Println(slice) }
Dans cet exemple, slice et slice1 pointent vers le même tableau sous-jacent, donc toutes les modifications apportées à l'un seront visibles dans l'autre.
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!