Home >Backend Development >Golang >Why Does Appending to a Slice Copy in Go Sometimes Modify the Original?

Why Does Appending to a Slice Copy in Go Sometimes Modify the Original?

DDD
DDDOriginal
2024-12-01 12:15:13451browse

Why Does Appending to a Slice Copy in Go Sometimes Modify the Original?

Why Do Slice Appends Modify the Original Slice in Go?

In Go, the built-in append function appends elements to a slice by creating a new underlying array, copying the existing elements, and appending the new elements. If the original slice and the slice used in the append function share the same underlying array, changes made to either slice will be reflected in both.

Consider the following code snippet:

func someFunc(A []int) int {
    ...
    tempA := A // copy the slice by value
    ...
    newArr = remove(tempA, i)
    ...
}

func remove(slice []int, s int) []int {
    return append(slice[:s], slice[s+1:]...)
}

Here, the someFunc function takes a slice A and creates a copy of it called tempA. The remove function then executes the append function on tempA to remove the element at index s.

As the tempA slice originally references the same underlying array as A, the modifications made to tempA (via the append function) are also reflected in A. This is because the append function creates a new underlying array and copies the existing elements into it. As A and tempA share the same underlying array, any changes made to one are also propagated to the other.

This behavior is expected in Go due to the way slices are implemented internally:

  • Slices are header objects that describe a section of an underlying array.
  • When copying a slice, the header is copied, but the underlying array is not.
  • If two slices share the same header, they reference the same underlying array and modifications made to one slice affect the other.

To avoid this shared reference behavior, you can create a new slice and copy the elements explicitly as follows:

tempA := make([]int, len(A))
copy(tempA, A)

The above is the detailed content of Why Does Appending to a Slice Copy in Go Sometimes Modify the Original?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn