197
社区成员
发帖
与我相关
我的任务
分享
我们看下slice的结构体:
type slice struct {
array unsafe.Pointer // 指向底层数组
len int // 长度,必选
cap int // 容量,可选
}
第一个成员变量指向的是底层数组,还有长度和容量的成员变量,可以扩容。
我们做切片操作,这个在容量范围内都是指向同一个底层数组:
package main
import "fmt"
func main() {
s1 := []int{1, 2, 3}
s2 := s1[0:]
for i, v := range s2 {
s2[i] = v * 2
}
fmt.Printf("%p,%p", s1, s2)
fmt.Printf("%v,%v", s1, s2)
}
//0xc000012150,0xc000012150[2 4 6],[2 4 6]
内存地址一样,修改s2也修改了s1,然后我们进行扩容操作,看下会不会指向同一底层数组?
package main
import "fmt"
func main() {
s1 := []int{1, 2, 3}
s2 := s1[0:]
for i, v := range s2 {
s2[i] = v * 2
}
fmt.Printf("%p,%p", s1, s2)
fmt.Printf("%v,%v\n", s1, s2)
//扩容操作
s2 = append(s2, 11)
for i, v := range s2 {
s2[i] = v * 2
}
fmt.Printf("%p,%p", s1, s2)
fmt.Printf("%v,%v", s1, s2)
}
/*
0xc000012150,0xc000012150[2 4 6],[2 4 6]
0xc000012150,0xc00000e3f0[2 4 6],[4 8 12 22]
*/
我们可以看出在扩容之后,s2的修改,s1没有跟着变化了,说明扩容之后没有指向同一个底层数组而是新开了一个。