This example highlights common operations, including tips and pitfalls, on Go slice.
Go append
function works for both nil and empty slices. Here's an example for nil slice.
var nilslice []State
// Append to a nil slice.
nilslice = append(nilslice, State{name: "California", population: 39512223})
fmt.Println(nilslice)
Works with an empty slice.
var emptyslice = []State{}
// Append to an empty slice.
emptyslice = append(emptyslice, State{name: "California", population: 39512223})
fmt.Println(emptyslice)
Note
We can think of the
append
function to be a 2-step operation that create a new slice and copy content form one slice to the new slice.b := append([]T{}, a)is the same as:
b := make([]T{}, len(a)) copy(b, a)
In this blog, Rob Pike describes it best:
"A slice is a data structure describing a contiguous section of an array stored separately from the slice variable itself. A slice is not an array. A slice describes a piece of an array."
In other words, we can create slice out of a slice. And the new subslice isn't a copy of the original slice, it's merely a slice of the original slice - all data stays.
We describe the boundaries of subslice by using the [:]
operator. Let's use the following slice as a reference:
s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Operator | Output | Description |
---|---|---|
s[:4] | [0 1 2 3] | slice with elements from start thru index (4-1) |
s[4:] | [4 5 6 7 8 9] | slice with elements from index 4 thru end |
s[2:6] | [2 3 4 5] | slice with elements from index 2 thru index (6-1) |
s[0:0] | [] | slice with 0 elements, an empty slice |
s[:] | [0 1 2 3 4 5 6 7 8 9] | full slice inclusive of all elements |
Use [:]
to remove an element from a slice. For example:
numbers := []int{1, 2, 3, 4}
numbers = numbers[1:]
fmt.Println(numbers) // Output 2, 3, 4
-
Run the program
$ make run