<h1 style="color:red">添加元素重新开辟空间与否取决初始化切片的方式,似乎这是bug?大伙速速进来看下!</h1>
![添加元素重新开辟空间与否取决初始化切片的方式.png](https://static.studygolang.com/190916/7739dda874d456a23ad71775fb1efd17.png)
****************************************************************************
![添加元素重新开辟空间与否取决初始化切片的方式111.png](https://static.studygolang.com/190916/77fdae882e043d19d03a95ec434018b5.png)
<h1 style="color:red">元芳,你怎么看??</h1>
### <h1 style="color:red">经过仔细思考,我只能感叹自己真的还不了解数组和切片(这坑太大),现给出原因如下: </h1>
![添加元素重新开辟空间与否取决初始化切片的方式222.png](https://static.studygolang.com/190916/e972cdf715926427f888519e9690bb1b.png)
在这给出源代码,便于复制粘贴:
```go
package main
import (
"fmt"
)
func main() {
//myint:=make([]int,5,5)
myint:=make([]int,5,6) //给足够的空间
fmt.Printf("--初始化时候slice addr:--%p---len:%v----cap:%v\n",myint,len(myint),cap(myint))
//myint= []int{
// 1,10,2,4,5,
//}
myint[0]=1
myint[1]=10
myint[2]=2
myint[3]=4
myint[4]=5
fmt.Printf("--初始化时候slice addr:--%p---len:%v----cap:%v\n",myint,len(myint),cap(myint))
//myint=append(myint, 1,10,2,4,5)
fmt.Printf("--初始化时候slice addr:--%p---len:%v----cap:%v\n",myint,len(myint),cap(myint))
fmt.Printf("--值为:--%v---\n",myint)
fmt.Println()
for key, value := range myint {
//fmt.Printf("-%p---",&value)
index:=2;
fmt.Printf("-%v---\n",myint)
fmt.Println(key,"第",key+1,"次遍历,此时全部元素为:",myint)
fmt.Println(key,"---此次遍历元素为:---",value)
if key==1{
after:=append([]int{},myint[index:]...)//用新切片保存插入位置之后的元素
fmt.Printf("= after==%p==%v=\n",after,after)
myint=append(myint[0:index],9)//用新元素插入到相应位置组成前置切片
fmt.Printf("= front==%p==%v=\n",myint,myint)
myint=append(myint,after...)//原地合并前后2个位置的切片元素
fmt.Printf("= myint==%p==%v=\n",myint,myint)
}
fmt.Println()
}
fmt.Printf("--最后时候slice addr:--%p---",myint)
fmt.Printf("--值为:--%v---\n",myint)
}
```
更多评论
说到底,基础太差.
slice有原地址扩容这种说法? 其底层存储结构是数组,当cap不足时,就会新建一个数组存储.
使用9 append的时候,cap不变,9替换了原数组位置的值.
遍历的时候,之所以数据没有变化,因为遍历的是变量的一个拷贝.
slice 结构
{
len,cap,array地址
}
所以当myint的地址改变时,其遍历的还是原来的数组,因此你得到的结果是: 1 10 9 4 5
#3