Home > Backend Development > Golang > How Does Go\'s `append()` Function Affect Slice Behavior When Passed by Value?

How Does Go\'s `append()` Function Affect Slice Behavior When Passed by Value?

DDD
Release: 2024-11-20 15:14:15
Original
905 people have browsed it

How Does Go's `append()` Function Affect Slice Behavior When Passed by Value?

Understanding Append() Behavior on Slices

When working with slices in Go, it's important to understand how the append() function interacts with slices passed by value.

Consider the following code snippet:

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)
}
Copy after login

In this example, two slices (slice and slice1) are created, with slice1 initially pointing to the same array as slice. However, after the first append() call, slice1 is assigned a new slice value that points to a different array. This assignment results in slice1's behavior being independent of slice.

Explanation:

  • Pass by value: In Go, everything is passed by value, which means that slice1 receives a copy of slice's slice header.
  • Append with capacity: When appending more than 0 elements to a slice with capacity equal to its length (as in this case), a new, larger array is allocated.
  • Slice header assignment: The append() call returns a new slice header pointing to the new array, which is assigned to slice1.
  • Independent slices: After the assignment, slice and slice1 become two distinct variables pointing to different slice headers and, therefore, different arrays.

Consequences:

  • Immutability: Changes made to elements in one slice (e.g., slice1) will not be reflected in the other slice (e.g., slice).
  • Memory management: Append operations can lead to memory reallocation, creating new arrays and potentially affecting performance.

To understand slice headers and their internals, refer to the following resources:

  • [Are golang slices pass by value?](https://stackoverflow.com/questions/25740338/are-golang-slices-pass-by-value)
  • [Go Slices: usage and internals](https://blog.golang.org/slices)

The above is the detailed content of How Does Go\'s `append()` Function Affect Slice Behavior When Passed by Value?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template