如何在不返回的情况下更改函数中的切片?

时间:2017-06-26 13:20:58

标签: go slice

我的代码就像这样

package main

import(
    "fmt"
)

func Pingpong(s []int){
    fmt.Printf("len:%v,cap:%v,address:%p\n",len(s),cap(s),s)
    s=append(s,3)
    fmt.Printf("len:%v,cap:%v,address:%p\n",len(s),cap(s),s)
}
func main(){
    s:=make([]int,1,2)
    fmt.Printf("value:%v,len:%v,cap:%v,address:%p\n",s[0],len(s),cap(s),s)
    Pingpong(s)
    fmt.Printf("value:%v,len:%v,cap:%v,address:%p\n",s[0],len(s),cap(s),s)
}

像这样的答案

value:0,len:1,cap:2,address:0x1040a128
len:1,cap:2,address:0x1040a128
len:2,cap:2,address:0x1040a128
value:0,len:1,cap:2,address:0x1040a128

为什么呢?你能告诉我原因吗?

1 个答案:

答案 0 :(得分:0)

注意无论何时在go中追加切片,append都会返回一个新切片。这是因为切片由固定大小的数组支持,并且多个切片可以由同一个数组支持。在这种情况下,append需要返回一个新切片,因为支持数组可能已更改。 (例如,创建一个更大的后备阵列以适应新项目)

您的方法与append非常相似,并且具有相同的限制。每次修改边界时,您都需要返回新的切片描述符。基本上每当你将切片设置为等于其他东西时,无论是通过使用追加还是采用子切片,你都必须返回你所做的新描述符。