Maison  >  Article  >  développement back-end  >  Pourquoi l'ajout à une tranche Go n'affecte-t-il pas les autres tranches pointant vers le même tableau sous-jacent ?

Pourquoi l'ajout à une tranche Go n'affecte-t-il pas les autres tranches pointant vers le même tableau sous-jacent ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-15 00:43:02601parcourir

Why Doesn\'t Appending to a Go Slice Affect Other Slices Pointing to the Same Underlying Array?

Understanding Append's Behavior on Slices

Problem Description:

Consider the following Go code:

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slice1 := slice
    slice1[0] = 10000
    fmt.Println(slice)

    slice1 = append(slice1, 100)
    slice1[0] = 20000

    fmt.Println(slice)
}

The initial output is as expected: both slice and slice1 show the same values. However, after the append operation on slice1, the values of slice remain unchanged. This behavior seems counterintuitive, given the assumption that slices are pointers.

Explanation:

The append function does not modify slice1. Go passes all values by value, so slice1 receives a copy of slice. The append operation creates a new array, since the original array has reached its capacity. It then copies the contents of the old array into the new one and returns a new slice header pointing to the new array.

The assignment of the return value to slice1 changes slice1. However, slice remains unaffected because it is a separate variable pointing to the original array. Therefore, any changes made to the elements of slice1 or slice after the append operation will not be reflected in the other.

In summary, slices in Go are pass-by-value, and append creates new slices with new underlying arrays when necessary. This means that changes made to one slice are not reflected in other slices pointing to the original array.

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