gpt4 book ai didi

go - 就地截断 slice

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:15 25 4
gpt4 key购买 nike

给定一个 slice (不是指向 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?

有没有办法修改现有 slice 的长度或容量,或者它们是不可变的?


预计到达时间:我认为这已经足够明显了,但显然不是:当我询问是否可以就地执行此操作时,我的意思是无需重新分配 s.

最佳答案

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

slice 就像底层数组的窗口。


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

关于go - 就地截断 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56484147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com