Go Slices: usage and internals
5 Jan 2011
Tags: slice, technical

Andrew Gerrand

* Introduction

Go's slice type provides a convenient and efficient means of working with
sequences of typed data.
Slices are analogous to arrays in other languages,
but have some unusual properties.
This article will look at what slices are and how they are used.

* Arrays

The slice type is an abstraction built on top of Go's array type,
and so to understand slices we must first understand arrays.

An array type definition specifies a length and an element type.
For example, the type `[4]int` represents an array of four integers.
An array's size is fixed; its length is part of its type (`[4]int` and `[5]int` are distinct,
incompatible types).
Arrays can be indexed in the usual way, so the expression `s[n]` accesses
the nth element, starting from zero.

	var a [4]int
	a[0] = 1
	i := a[0]
	// i == 1

Arrays do not need to be initialized explicitly;
the zero value of an array is a ready-to-use array whose elements are themselves zeroed:

	// a[2] == 0, the zero value of the int type

The in-memory representation of `[4]int` is just four integer values laid out sequentially:

.image go-slices-usage-and-internals_slice-array.png

Go's arrays are values. An array variable denotes the entire array;
it is not a pointer to the first array element (as would be the case in C).
This means that when you assign or pass around an array value you will make
a copy of its contents.
(To avoid the copy you could pass a _pointer_ to the array,
but then that's a pointer to an array, not an array.) One way to think about
arrays is as a sort of struct but with indexed rather than named fields:
a fixed-size composite value.

An array literal can be specified like so:

	b := [2]string{"Penn", "Teller"}

Or, you can have the compiler count the array elements for you:

	b := [...]string{"Penn", "Teller"}

In both cases, the type of `b` is `[2]string`.

* Slices

Arrays have their place, but they're a bit inflexible,
so you don't see them too often in Go code.
Slices, though, are everywhere. They build on arrays to provide great power and convenience.

The type specification for a slice is `[]T`,
where `T` is the type of the elements of the slice.
Unlike an array type, a slice type has no specified length.

A slice literal is declared just like an array literal, except you leave out the element count:

	letters := []string{"a", "b", "c", "d"}

A slice can be created with the built-in function called `make`, which has the signature,

	func make([]T, len, cap) []T

where T stands for the element type of the slice to be created.
The `make` function takes a type, a length,
and an optional capacity.
When called, `make` allocates an array and returns a slice that refers to that array.

	var s []byte
	s = make([]byte, 5, 5)
	// s == []byte{0, 0, 0, 0, 0}

When the capacity argument is omitted, it defaults to the specified length.
Here's a more succinct version of the same code:

	s := make([]byte, 5)

The length and capacity of a slice can be inspected using the built-in `len` and `cap` functions.

	len(s) == 5
	cap(s) == 5

The next two sections discuss the relationship between length and capacity.

The zero value of a slice is `nil`. The `len` and `cap` functions will both return 0 for a nil slice.

A slice can also be formed by "slicing" an existing slice or array.
Slicing is done by specifying a half-open range with two indices separated by a colon.
For example, the expression `b[1:4]` creates a slice including elements
1 through 3 of `b` (the indices of the resulting slice will be 0 through 2).

	b := []byte{'g', 'o', 'l', 'a', 'n', 'g'}
	// b[1:4] == []byte{'o', 'l', 'a'}, sharing the same storage as b

The start and end indices of a slice expression are optional; they default to zero and the slice's length respectively:

	// b[:2] == []byte{'g', 'o'}
	// b[2:] == []byte{'l', 'a', 'n', 'g'}
	// b[:] == b

This is also the syntax to create a slice given an array:

	x := [3]string{"Лайка", "Белка", "Стрелка"}
	s := x[:] // a slice referencing the storage of x

* Slice internals

A slice is a descriptor of an array segment.
It consists of a pointer to the array, the length of the segment,
and its capacity (the maximum length of the segment).

.image go-slices-usage-and-internals_slice-struct.png

Our variable `s`, created earlier by `make([]byte,`5)`, is structured like this:

.image go-slices-usage-and-internals_slice-1.png

The length is the number of elements referred to by the slice.
The capacity is the number of elements in the underlying array (beginning
at the element referred to by the slice pointer).
The distinction between length and capacity will be made clear as we walk
through the next few examples.

As we slice `s`, observe the changes in the slice data structure and their relation to the underlying array:

	s = s[2:4]

.image go-slices-usage-and-internals_slice-2.png

Slicing does not copy the slice's data. It creates a new slice value that
points to the original array.
This makes slice operations as efficient as manipulating array indices.
Therefore, modifying the _elements_ (not the slice itself) of a re-slice
modifies the elements of the original slice:

	d := []byte{'r', 'o', 'a', 'd'}
	e := d[2:]
	// e == []byte{'a', 'd'}
	e[1] = 'm'
	// e == []byte{'a', 'm'}
	// d == []byte{'r', 'o', 'a', 'm'}

Earlier we sliced `s` to a length shorter than its capacity. We can grow s to its capacity by slicing it again:

	s = s[:cap(s)]

.image go-slices-usage-and-internals_slice-3.png

A slice cannot be grown beyond its capacity.
Attempting to do so will cause a runtime panic,
just as when indexing outside the bounds of a slice or array.
Similarly, slices cannot be re-sliced below zero to access earlier elements in the array.

* Growing slices (the copy and append functions)

To increase the capacity of a slice one must create a new,
larger slice and copy the contents of the original slice into it.
This technique is how dynamic array implementations from other languages
work behind the scenes.
The next example doubles the capacity of `s` by making a new slice,
`t`, copying the contents of `s` into `t`,
and then assigning the slice value `t` to `s`:

	t := make([]byte, len(s), (cap(s)+1)*2) // +1 in case cap(s) == 0
	for i := range s {
	        t[i] = s[i]
	}
	s = t

The looping piece of this common operation is made easier by the built-in copy function.
As the name suggests, copy copies data from a source slice to a destination slice.
It returns the number of elements copied.

	func copy(dst, src []T) int

The `copy` function supports copying between slices of different lengths
(it will copy only up to the smaller number of elements).
In addition, `copy` can handle source and destination slices that share
the same underlying array,
handling overlapping slices correctly.

Using `copy`, we can simplify the code snippet above:

	t := make([]byte, len(s), (cap(s)+1)*2)
	copy(t, s)
	s = t

A common operation is to append data to the end of a slice.
This function appends byte elements to a slice of bytes,
growing the slice if necessary, and returns the updated slice value:

	func AppendByte(slice []byte, data ...byte) []byte {
	    m := len(slice)
	    n := m + len(data)
	    if n > cap(slice) { // if necessary, reallocate
	        // allocate double what's needed, for future growth.
	        newSlice := make([]byte, (n+1)*2)
	        copy(newSlice, slice)
	        slice = newSlice
	    }
	    slice = slice[0:n]
	    copy(slice[m:n], data)
	    return slice
	}

One could use `AppendByte` like this:

	p := []byte{2, 3, 5}
	p = AppendByte(p, 7, 11, 13)
	// p == []byte{2, 3, 5, 7, 11, 13}

Functions like `AppendByte` are useful because they offer complete control
over the way the slice is grown.
Depending on the characteristics of the program,
it may be desirable to allocate in smaller or larger chunks,
or to put a ceiling on the size of a reallocation.

But most programs don't need complete control,
so Go provides a built-in `append` function that's good for most purposes;
it has the signature

	func append(s []T, x ...T) []T

The `append` function appends the elements `x` to the end of the slice `s`,
and grows the slice if a greater capacity is needed.

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

To append one slice to another, use `...` to expand the second argument to a list of arguments.

	a := []string{"John", "Paul"}
	b := []string{"George", "Ringo", "Pete"}
	a = append(a, b...) // equivalent to "append(a, b[0], b[1], b[2])"
	// a == []string{"John", "Paul", "George", "Ringo", "Pete"}

Since the zero value of a slice (`nil`) acts like a zero-length slice,
you can declare a slice variable and then append to it in a loop:

	// Filter returns a new slice holding only
	// the elements of s that satisfy fn()
	func Filter(s []int, fn func(int) bool) []int {
	    var p []int // == nil
	    for _, v := range s {
	        if fn(v) {
	            p = append(p, v)
	        }
	    }
	    return p
	}

* A possible "gotcha"

As mentioned earlier, re-slicing a slice doesn't make a copy of the underlying array.
The full array will be kept in memory until it is no longer referenced.
Occasionally this can cause the program to hold all the data in memory when
only a small piece of it is needed.

For example, this `FindDigits` function loads a file into memory and searches
it for the first group of consecutive numeric digits,
returning them as a new slice.

	var digitRegexp = regexp.MustCompile("[0-9]+")

	func FindDigits(filename string) []byte {
	    b, _ := ioutil.ReadFile(filename)
	    return digitRegexp.Find(b)
	}

This code behaves as advertised, but the returned `[]byte` points into an
array containing the entire file.
Since the slice references the original array,
as long as the slice is kept around the garbage collector can't release the array;
the few useful bytes of the file keep the entire contents in memory.

To fix this problem one can copy the interesting data to a new slice before returning it:

	func CopyDigits(filename string) []byte {
	    b, _ := ioutil.ReadFile(filename)
	    b = digitRegexp.Find(b)
	    c := make([]byte, len(b))
	    copy(c, b)
	    return c
	}

A more concise version of this function could be constructed by using `append`.
This is left as an exercise for the reader.

* Further Reading

[[https://golang.org/doc/effective_go.html][Effective Go]] contains an in-depth
treatment of [[https://golang.org/doc/effective_go.html#slices][slices]]
and [[https://golang.org/doc/effective_go.html#arrays][arrays]],
and the Go [[https://golang.org/doc/go_spec.html][language specification]]
defines [[https://golang.org/doc/go_spec.html#Slice_types][slices]] and
their [[https://golang.org/doc/go_spec.html#Length_and_capacity][associated]]
[[https://golang.org/doc/go_spec.html#Making_slices_maps_and_channels][helper]]
[[https://golang.org/doc/go_spec.html#Appending_and_copying_slices][functions]].
