Go: Append function explained

The built-in append function appends elements to the end of a slice:

  • if there is enough capacity, the underlying array is reused;
  • if not, a new underlying array is allocated and the data is copied over.

Append returns the updated slice. Therefore you need to store the result of an append, often in the variable holding the slice itself:

slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)

Appending a single element takes constant amortized time. The article Amortized time complexity explains this in detail.

Special case

It is legal to append a string to a byte slice:

slice = append([]byte("hello "), "world"...)


Append an element to a slice:

a := []int{1, 2}
a = append(a, 3) // a == [1 2 3]

Concatenate two slices:

a := []int{1, 2}
b := []int{11, 22}
a = append(a, b...) // a == [1 2 11 22]

The result does not depend on whether the arguments overlap, so we can for instance concatenate a slice with itself:

a := []int{1, 2}
a = append(a, a...) // a == [1 2 1 2]