Slices

Slices are a key data type in Go+, giving a more powerful interface to sequences than arrays.

Slice foundations

Unlike arrays, slices are typed only by the elements they contain (not the number of elements). To create an empty slice with non-zero length, use the builtin make. Here we make a slice of strings of length 3 (initially zero-valued).

s := make([]string, 3) println "emp:", s

We can set and get just like with arrays.

s[0] = "a" s[1] = "b" s[2] = "c" println "set:", s println "get:", s[2]

len returns the length of the slice as expected.

println "len:", len(s)

In addition to these basic operations, slices support several more that make them richer than arrays. One is the builtin append, which returns a slice containing one or more new values. Note that we need to accept a return value from append as we may get a new slice value.

s = append(s, "d") s = append(s, "e", "f") println "apd:", s

Slices can also be copy’d. Here we create an empty slice c of the same length as s and copy into c from s.

c := make([]string, len(s)) copy c, s println "cpy:", c

Slices support a “slice” operator with the syntax slice[low:high]. For example, this gets a slice of the elements s[2], s[3], and s[4].

l := s[2:5] println "sl1:", l

This slices up to (but excluding) s[5].

l = s[:5] println "sl2:", l

And this slices up from (and including) s[2].

l = s[2:] println "sl3:", l

Slice literals in Go+ style

TODO

Slice literals in Go style

We can declare and initialize a variable for slice in a single line as well.

t := []string{"g", "h", "i"} println "dcl:", t

Slice advance

buf := make([]byte, 0, 128) buf = append(buf, 'H', 'e', 'l', 'l', 'o') buf = append(buf, ' ') buf = append(buf, "world"...) println string(buf)

Slices can be composed into multi-dimensional data structures. The length of the inner slices can vary, unlike with multi-dimensional arrays.

twoD := make([][]int, 3) for i := 0; i < 3; i++ { innerLen := i + 1 twoD[i] = make([]int, innerLen) for j := 0; j < innerLen; j++ { twoD[i][j] = i + j } } println "2d: ", twoD

Next example: Maps