Use [] to find tag! Example: [flutter, javascript]

Learn Go Programming Language
Learn Go Programming Language

Chapter 5.8

Slice Data Type

remove_red_eye 691 Times
spellcheck 614 Words, 4103 Characters
*Note: this book is still ongoing until it has a finished label.

In the programming world, flexible and dynamic data types are essential, especially when working with variable data sets. In Golang, slices are a data type designed for this purpose. Slices provide a way to work with the underlying array but with greater flexibility. Let’s dive deeper into slices, their anatomy, how they differ from arrays, and their best practices.

What is Slice?

Slice is a dynamic data type in Golang that allows us to manage collections of elements with variable sizes. Unlike arrays that have a fixed length, slices can be increased or decreased as needed. Slices act as a layer on top of arrays, providing access to part or all of an array without the need to redefine it.

Anatomy Slice

Slice consists of three main components:

  1. Pointer: Shows the address of the first element of the slice in the underlying array.
  2. Length: The number of elements present in a slice.
  3. Capacity: The maximum number of elements that can be retrieved from the underlying array without reallocation.

Here's an example of how slices work on the underlying array:

arr := [5]int{10, 20, 30, 40, 50}
slice := arr[1:4] // Mengambil elemen dari indeks 1 hingga 3

In this example, slice has a pointer to the second element of arr, a length of 3, and a capacity of 4 (because the elements in arr available after index 1 are four elements). So the output of the slice variable is

[20 30 40]

Difference Between Slice and Array

DifferenceArraySlice
SizeStay at declarationDynamic, can increase or decrease
InitializationNeeds a fixed lengthCan be initialized without length
PointerJump straight to the elementHas a pointer to the underlying array
FungsiLess flexible for dynamic dataFlexible for dynamic data management

Creating Slice

There are several ways to create slices in Golang:

1. Using Slice Literals:

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

Here, nums is a slice with length 5 and capacity 5.

The output when printed with fmt.Println is:

[1 2 3 4 5]

2. Using the `make` Function:

nums := make([]int, 5) // Create a slice with length 5 and capacity 5

The output when printed with fmt.Println is:

[0 0 0 0 0]

We can also add additional capacity:

nums := make([]int, 5, 10) // Length 5, capacity 10

The output when printed with fmt.Println is:

[0 0 0 0 0]

3. From Existing Array:

arr := [5]int{10, 20, 30, 40, 50}
slice := arr[1:4] // Create a slice from elements index 1 to 3

The output when printed with fmt.Println is:

[20 30 40]

Best Practice for Using Slices

1. Initialize with Sufficient Capacity

When creating large slices, use make with a capacity close to the estimated need. This avoids extra memory allocations when append adds elements.

users := make([]string, 0, 100) // Slice with initial capacity of 100

2. Use `append` to Add Elements

append is the standard way to add elements to a slice. It automatically reallocates memory if the slice runs out of capacity.

slice := []int{1, 2, 3}
slice = append(slice, 4, 5) // Slice into [1, 2, 3, 4, 5]

3. Avoid Over-Cutting on Large Slices

Reslicing with too large a capacity can cause unnecessary memory usage.

largeSlice := make([]int, 1000)
smallSlice := largeSlice[:10] // Only need 10 elements, but capacity remains 1000

Examples of Slice Usage

package main

import "fmt"

func main() {
    // Initialize slice with literal
    nums := []int{1, 2, 3, 4, 5}

    // Adds an element to a slice
    nums = append(nums, 6)

    // Cutting slices
    subNums := nums[1:4]

    fmt.Println("Main slice:", nums)
    fmt.Println("Result:", subNums)
}

Cheatsheet Slice

CodeDescription
make([]T, length, capacity)
Create a slice with type T, length, capacity
len(slice)Get slice length
cap(slice)Get slice capacity
append(slice, elem)Adding elements to a slice
slice[start:end]Cuts the slice from the start index to the end index-1
copy(dest, src)Copy elements from src to dest

Conclusion

Slice in Golang is a very useful and flexible data type for managing data sets with dynamic length. By understanding the anatomy, differences with arrays, and best practices, we can use slices effectively and efficiently.

Next Article (Map Data Type)
Content Navigation