Skip to content

Arrays and Slices in Go

Arrays and slices are fundamental data structures in Go used for storing and manipulating ordered sequences of elements. While they share similarities, they have key differences in size and flexibility.

Arrays have a fixed size defined at declaration. They are declared using [size]type{values}:

numbers := [5]int{1, 2, 3, 4, 5}

This creates an array numbers of size 5, initialized with values 1 to 5.

Elements are accessed using their index within square brackets:

firstNumber := numbers[0] // firstNumber will be 1
thirdNumber := numbers[2] // thirdNumber will be 3

Index starts from 0, and accessing an out-of-bounds index leads to a panic.

Elements can be modified using the same syntax:

numbers[2] = 10 // Change third element to 10
  • len(array) returns the number of elements in the array (always equal to the declared size).
  • Arrays don’t have a separate capacity concept.

Slices are dynamically-sized, flexible references to underlying arrays. They are created using:

  • []type: Empty slice of a specific type.
  • make([]type, length, capacity): Allocate a slice with specified length and capacity.
  • Slicing an existing array or slice: slice := array[low:high].
// Empty slice
emptySlice := []string{}
// Slice with length and capacity
numbersSlice := make([]int, 3, 5) // Length 3, capacity 5
// Slicing an array
myArray := [5]int{1, 2, 3, 4, 5}
subSlice := myArray[1:4] // Subslice from index 1 to 4 (excluding 4)

Similar to arrays, elements are accessed and modified using their index:

firstElement := numbersSlice[0] // firstElement will be 0
subSlice[1] = 20 // Change second element of subSlice
  • len(slice) returns the number of elements in the slice.
  • cap(slice) returns the capacity (maximum number of elements) of the underlying array.

Slices can be sliced to create new sub-slices:

subSubSlice := subSlice[0:2] // Subslice of subSlice from index 0 to 2 (excluding 2)

The append function adds elements to the end of a slice and returns a new slice with the updated elements:

newSlice := append(numbersSlice, 10, 20) // Creates a new slice with numbersSlice + 10 and 20
  • append: Adds elements to the end of a slice.
  • copy: Copies elements from one slice to another.
  • cap: Returns the capacity of a slice.
  • make: Creates a slice with specified length and capacity.

These are just some of the essential aspects of arrays and slices in Go. Remember to explore the documentation and experiment with code for a deeper understanding.

Multidimensional arrays are arrays of arrays. They are declared like:

grid := [3][4]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}

Elements are accessed using multiple indices:

firstElement := grid[0][0] // firstElement will be 1
thirdRow := grid[2] // thirdRow is a 1D array {9, 10, 11, 12}

Slices can be used with multidimensional arrays:

subGrid := grid[1:3] // Subgrid is a 2D slice containing second and third rows
subRow := grid[0][1:3] // Subrow is a slice of second and third elements in the first row

Slices are passed by reference to functions, meaning changes within the function modify the original slice.

func modifySlice(s []int) {
s[0] = 100
}
numbers := []int{1, 2, 3}
modifySlice(numbers)
fmt.Println(numbers) // Output: [100 2 3]
  • Use append to add elements to a slice within a function.
  • Be cautious when modifying the underlying array directly, as it can lead to unexpected behavior.
func appendToSlice(s []int, value int) {
s = append(s, value)
}
numbers := []int{1, 2, 3}
appendToSlice(numbers, 4)
fmt.Println(numbers) // Output: [1 2 3 4]

Remember, these are just brief introductions to each subtopic. For deeper understanding, explore the Go documentation and experiment with code examples.