当前位置: 首页 > 知识库问答 >
问题:

golang slice切片扩容问题?

子车飞鹏
2023-10-25
package mainimport "fmt"func main() {    s3:=make([]int,2,10)    fmt.Println(s3)    Test2(s3)    fmt.Println(s3)    s4:=s3[0:10]    fmt.Println(s4)}func Test2(s []int){    s=append(s,6)    s=append(s,6)    s=append(s,6)    fmt.Println(s)}

得出的结果是:
[0 0]
[0 0 6 6 6]
[0 0]
[0 0 6 6 6 0 0 0 0 0]
请问一下,第三个结果为什么是[0 0],而不是 [0 0 6 6 6] 呢,
在Test2 函数中,使用append的时候,并没有扩容,添加的数据还在底层数组的容量中, 那为啥在 Test2函数之后 s3是[0 0]
即使是在原有的容量基础上扩容,那为啥 s4:=s3[0:10] 是[0 0 6 6 6 0 0 0 0 0],按理来说在函数中扩容之后和外面的没关系了,那s4 应该是[0 0]才对

共有1个答案

萧献
2023-10-25

s3 跟 Test2 中的 s 是两回事。

Test2 中 append 没有扩容,只是改变了 slice 的长度。但是它改变的是 s 的长度,而不是 s3 。它们依然共享这一个数组,但是他们有不同的长度。在 Test2 之后,数组中已经的是 [0,0,6,6,6,0,...] ,但是由于 s3 的长度还是 2 ,所以打出来还是 [0,0] 。

s4 打出了数组中的全部内容。

 类似资料:
  • 我试图用netty 4.0.10.final创建一个零拷贝应用程序。我在切片方面有问题。下面是我的解码(有问题的)方法: 我的应用程序/netty也可以接收不完整的消息。 在接收到整个消息时,整个管道处理工作良好。我的管道从ServerBootstrap开始->ChannelInitializer->ByteToMessageDecoder->ByteToMessageDecoder->Messa

  • 问题内容: 考虑以下代码 https://play.golang.org/p/zv8KQekaxH8 使用slice变量调用简单的Println会更改其容量。我怀疑调用带有可变参数的任何函数都会产生相同的效果。对于这种行为是否有任何理智的解释? 问题答案: 解释是,就像github中的 bradfitz point 一样,如果您不使用它来创建切片,则编译器将使用它认为方便的上限。 创建具有不同版本

  • 问题内容: 我很好奇拆包切片并将其作为参数发送给可变参数函数。 假设我们有一个带有可变参数的函数: 如果我们不想传入一个接口,它就可以工作,那么我们是否拆包都没关系: 如果我们有一片片的话,那会很棘手。在这里,编译器不允许我们传递解压版本: 错误提示: 在解包参数中不能将sliceOfSlices(类型[] [] interface {})用作类型[] interface {} 我不知道为什么会这

  • 取一个list或tuple的部分元素是非常常见的操作。比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 取前3个元素,应该怎么做? 笨办法: >>> [L[0], L[1], L[2]] ['Michael', 'Sarah', 'Tracy'] 之所以是笨办法是因为扩展一下,取前N个元素就没辙了。 取前N个元素

  • 举个例子 给你一个list 让你取前30个怎么办? a = [] # 很多数据 a[0],a[1] #按照这种方式吗?这也太复杂了! for i in a: pass ## 这种方式也是可以的,但是还是有点复杂了,在编程语言中,或者是我们的编程思想中,less is more是最重要的,也就是说,写的越少越好。 # 所以我们可以采用切片的方式 a[1:3],从第二个开始到第

  • 取一个list或tuple的部分元素是非常常见的操作。比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 取前3个元素,应该怎么做? 笨办法: >>> [L[0], L[1], L[2]] ['Michael', 'Sarah', 'Tracy'] 之所以是笨办法是因为扩展一下,取前N个元素就没辙了。 取前N个元素