Maison >développement back-end >Golang >Comment append() affecte-t-il les tranches dans Go ?

Comment append() affecte-t-il les tranches dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-15 13:54:02796parcourir

How Does append() Affect Slices in Go?

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!

Déclaration:
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