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]].
