给出切片(不是指向切片的指针!),有什么方法可以将其截断到位吗?
由于作用域,天真的实现无法正常工作
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
。
答案 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,也无法对数组进行处理。