Golang append an item to a slice

Why does the slice a remain the same? Does append() generate a new slice?

package main

import (
    "fmt"
)

var a = make([]int, 7, 8)

func Test(slice []int) {
    slice = append(slice, 100)
    fmt.Println(slice)
}

func main() {
    for i := 0; i < 7; i++ {
        a[i] = i
    }

    Test(a)
    fmt.Println(a)
}

Output:

[0 1 2 3 4 5 6 100]
[0 1 2 3 4 5 6]
1 Like

In your example the slice argument of the Test function receives a copy of the variable a in the caller’s scope.

Since a slice variable holds a “slice descriptor” which merely references an underlying array, in your Test function you modify the slice descriptor held in the slice variable several times in a row, but this does not affect the caller and its a variable.

Inside the Test function, the first append reallocates the backing array under the slice variable, copies its original contents over, appends 100 to it, and that’s what you’re observing. Upon exiting from Test , the slice variable goes out of scope and so does the (new) underlying array that slice references.

If you want to make Test behave like append , you have to return the new slice from it — just like append does — and require the callers of Test to use it in the same way they would use append :

func Test(slice []int) []int {
    slice = append(slice, 100)

    fmt.Println(slice)

    return slice
}

a = Test(a)

Please read this article thoroughly as it basically shows you how to implement append by hand, after explaining how slices are working internally. Then read this.

Refer: stackoverflow.com