我的代码就像这样
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
为什么呢?你能告诉我原因吗?
答案 0 :(得分:0)
注意无论何时在go中追加切片,append
都会返回一个新切片。这是因为切片由固定大小的数组支持,并且多个切片可以由同一个数组支持。在这种情况下,append需要返回一个新切片,因为支持数组可能已更改。 (例如,创建一个更大的后备阵列以适应新项目)
您的方法与append
非常相似,并且具有相同的限制。每次修改边界时,您都需要返回新的切片描述符。基本上每当你将切片设置为等于其他东西时,无论是通过使用追加还是采用子切片,你都必须返回你所做的新描述符。