截断切片

时间:2019-06-06 19:43:57

标签: go slice

给出切片(不是指向切片的指针!),有什么方法可以将其截断到位吗?

由于作用域,天真的实现无法正常工作

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:我认为这很明显,但显然不是:当我问是否有可能适当地执行此 时,我的意思是无需重新分配< / em> s

2 个答案:

答案 0 :(得分:0)

This是必经之路:

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

切片就像是底层数组的窗口。


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

答案 1 :(得分:0)

无法完成,因为slices are passed by value

请注意,截至2013年4月,Go语言规范no longer refers to slices, maps, and channels as "reference types"。 (行为没有改变,只是用来描述它的语言。)

由于an array's length is part of its type,也无法对数组进行处理。