func main() {
var t=make([]int,0,10)
var s=make([]int,0,10)
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",t,len(t),t);
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",s,len(s),s);
result: addr:0x1044c030 len:0 content:[]
addr:0x1044c060 len:0 content:[]
t =append(s,1,2,3,4)
fmt.Println(t)
fmt.Println(s)
result: [1 2 3 4]
[]
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",t,len(t),t);
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",s,len(s),s); }
result: addr:0x1044c060 len:4 content:[1 2 3 4]
addr:0x1044c060 len:0 content:[]
**一开始两个切片地址不同,可以理解。
后面我进行append,容量足够的情况下,切片地址是不会变的,那为什么`s和t`的地址是一样的,它们的内容却不一样?
还有,这里发帖怎么换行?新来的,请多多关照**
```
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",&t,len(t),t)
fmt.Printf("addr:%p \t\tlen:%v content:%v\n",&s,len(s),s)
```
#1
更多评论
切片是基于数组的。可以把切片简单的理解为数组中的一段,它保留了指向数组中某个元素(可以不是第一个元素)的指针,以及它本身的长度(也就是切片的大小)。`var s=make([]int,0,10)`这条语句创建了一个长度为10的数组,并在该数组之上建立了一个切片s,该切片保留指向数组第一个元素的指针,以及它的长度(0)。`t = append(s,1,2,3,4)` 这条语句向 s 指向的数组中追加了 4 个元素(注意这里 s 并没有变化,它的长度仍然是0,仅仅是底层数组变了)并返回新的切片(指向数组的第一个元素,长度为4)赋值给 t 。现在 s 和 t 都指向同一个数组的第一个元素,因此他们的地址是相同的。而 s 的长度是0,t 的长度是4.
可以参考go的文档:go doc builtin.make 以及 go doc builtin.append
#2
当执行append的内容超出底层数组长度时,`t=append(s,[]int{1,2,3,4,5,6,7,8,9,10,11}...)`, s的指向的还是原来自己的数组,但是,t指向的是新的数组。这个原因是因为底层数组不够用,重新分配一个新的数组装填这些内容之后返回slice给t ,而s的底层数组的长度和内容均没有变化。这样理解对么?<a href="/user/Cynhard" title="@Cynhard">@Cynhard</a>
#3