Усеченный срез на месте - PullRequest
0 голосов
/ 06 июня 2019

Учитывая срез (не указатель на срез!), Есть ли способ его усечь?

Наивная реализация не работает из-за области действия:

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\n", s1)
    fmt.Printf("%v\n", s)
}

печать

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

Есть ли способ изменить длину или емкость существующего среза или они неизменны?


ETA: Я подумал, что это достаточно очевидно, но, очевидно, нет: когда я спрашиваю, возможно ли сделать это вместо , я имею в виду без переназначения s.

1 Ответ

0 голосов
/ 06 июня 2019

Это путь:

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]
}

Срез похож на окно для основного массива.


Другой способ, используя указатель на срез :

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]
}
...