Go Slice Expressions: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 38: Line 38:
=Idiomatic Use Cases=
=Idiomatic Use Cases=
==Truncate a Slice==
==Truncate a Slice==
Drop the first element:
===Drop the First Element===
<syntaxhighlight lang='go'>
<syntaxhighlight lang='go'>
slice := slice[1:len(slice)]
slice := slice[1:len(slice)]
Line 45: Line 45:
<syntaxhighlight lang='go'>
<syntaxhighlight lang='go'>
slice := slice[1:]
slice := slice[1:]
</syntaxhighlight>
===Drop the Last Element===
<syntaxhighlight lang='go'>
slice := slice[0:len(slice)-1]
</syntaxhighlight>
</syntaxhighlight>

Revision as of 03:03, 19 August 2024

Internal

TODO

Overview

Slice expressions can be used on array or other slices.

A slice expression applied to a slice creates a new slice that shares the underlying array with the original slice. Applying a slice expression to a slice is called reslicing.

ss := make([]int, 10) // declare a slice with length and capacity 10, initialized with 0
ss2 := ss[3:6]

    ┌─────────────────────┐
 ss │pointer,len=10,cap=10│
    └──│──────│──────│────┘
       │      └──────┴──────────────────────────┐
       └──────────────────────┐                 │
                              ▼                 ▼
                             ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
             derlying array  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
                              0 1 2 3 4 5 6 7 8 9
                                    ▲   ▲       ▲
        ┌───────────────────────────┘   │       │
        │      ┌────────────────────────┘       │
        │      │     ┌──────────────────────────┘
    ┌───│──────│─────│────┐    
ss2 │ pointer,len=3,cap=7 │
    └─────────────────────┘

The slice expression creates a different slice that provides access to the elements with indexes 3, 4, 5 of the underlying array. Both slices ss and ss2 provide access to those elements and changes operated via one slice are visible to the other.

The length of the second slice is the number of elements defined by the slice expression (3). However, since the slices share the same underlying array, the capacity of the second slice is the number of elements from the element with index 3 to the end of the underlying array: 7.

Idiomatic Use Cases

Truncate a Slice

Drop the First Element

slice := slice[1:len(slice)]

Equivalent with:

slice := slice[1:]

Drop the Last Element

slice := slice[0:len(slice)-1]