# Golang 2D Slices and Arrays

Represent multiple dimensions by nesting slices and arrays. Learn 2D slice syntax.
2D slice, array. In this digital world we check the map. Our destination is the lake. This map has just 2 dimensions—but that is enough for navigation.
In the Go language we model 2D things (like the adventurer's map) with slices of slices. In the two levels of nesting we store the two dimensions.
Slice example. Consider a slice of slices: we could use the term "jagged" to describe nested slices. Each sub-slice can be any number of elements long.Slice

Step 1: Initially we create an empty slice of slices—it has no top-level slice elements.

Step 2: Here we create 2 rows (which are also slices). And with append() we add the two rows to the "values."

Step 3: We can access entire rows with the first index. Row 0 is the first row, and row 1 is the second row.

Step 4: With 2 indexes, we address a single int element. We can get or set an integer in the nested slices.

Golang program that uses 2d slices package main import "fmt" func main() { // Step 1: create empty collection. values := [][]int{} // Step 2: these are the first two rows. // ... Append each row to the two-dimensional slice. row1 := []int{1, 2, 3} row2 := []int{4, 5, 6} values = append(values, row1) values = append(values, row2) // Step 3: display first row, and second row. fmt.Println("Row 1") fmt.Println(values[0]) fmt.Println("Row 2") fmt.Println(values[1]) // Step 4: access an element. fmt.Println("First element") fmt.Println(values[0][0]) } Output Row 1 [1 2 3] Row 2 [4 5 6] First element 1
2D arrays. To create a 2D array we must specify each dimension. We can then assign individual elements within the array. Here we create a 2 by 2 array of strings.

Tip: Arrays in Go have fixed sizes. We must specify the size of the array. For variable-size collections, slices are better.

Golang program that creates 2D array package main import "fmt" func main() { // Create two-dimensional array. letters := [2][2]string{} // Assign all elements in 2 by 2 array. letters[0][0] = "a" letters[0][1] = "b" letters[1][0] = "c" letters[1][1] = "d" // Display result. fmt.Println(letters) } Output [[a b] [c d]]
Nested string slices. Here we use strings in nested slices. Each slice does not have the same length: this is a jagged slice. We loop over the nested slices with for.

Range: The range built-in returns all indexes (in order) of the animals slice. We then access each nested slice of animal names.

Range
Golang program that uses nested string slices package main import "fmt" func main() { // Create an empty slice of slices. animals := [][]string{} // Create three string slices. row1 := []string{"fish", "shark", "eel"} row2 := []string{"bird"} row3 := []string{"lizard", "salamander"} // Append string slices to outer slice. animals = append(animals, row1) animals = append(animals, row2) animals = append(animals, row3) // Loop over slices in animals. for i := range animals { fmt.Printf("Row: %v\n", i) fmt.Println(animals[i]) } } Output Row: 0 [fish shark eel] Row: 1 [bird] Row: 2 [lizard salamander]
Some data sources are often stored in a two-dimensional plane. This can be efficient. But often, using a map is a good option—it saves space in sparse collections.
A review. Idiomatic Go is code that matches the language's popular usage. In Go we usually prefer slices (not arrays). So a 2D slice is an ideal solution.
© 2007-2020 Sam Allen. Every person is special and unique. Send bug reports to info@dotnetperls.com.
Home
Dot Net Perls