截断切片

Given a slice (not a pointer to a slice!) is there any way to truncate it in place?

The naive implementation doesn't work, because of scope:

package main

import (
    "fmt"
)

func truncate(s []int, to int) []int{
    s = s[:to] # <- has no effect outside this function
    return s
}

func main() {
    s := []int{0, 1, 2, 3, 4}
    s1 := truncate(s, 3)
    fmt.Printf("%v
", s1)
    fmt.Printf("%v
", s)
}

prints

[0 1 2]
[0 1 2 3 4] # <- can we get [0 1 2] here?

Is there any way to modify the length or capacity of an existing slice, or are they immutable?


ETA: I thought this was obvious enough, but apparently not: when I ask whether it's possible to do this in place, I mean without reassigning s.

This is the way to go:

package main

import "fmt"

func main() {
    s := []int{0, 1, 2, 3, 4}
    s = truncate(s, 3)
    fmt.Println(s) // [0 1 2]
}
func truncate(s []int, to int) []int {
    return s[:to]
}

Slice is like a window to an underlying array.


The other way using pointer to the slice:

package main

import "fmt"

func main() {
    s := []int{0, 1, 2, 3, 4}
    truncate(&s, 3)
    fmt.Println(s) // [0 1 2]
}

func truncate(s *[]int, to int) {
    *s = (*s)[:to]
}