slice切片扩容之后,还是指向原来的底层数组吗?
我们看下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没有跟着变化了,说明扩容之后没有指向同一个底层数组而是新开了一个。
相关推荐
Go语言面试八股文大全
Go语言面试八股文大全
Golang slice切片操作之切片的追加、删除、插入等
主要介绍了Golang slice切片操作之切片的追加、删除、插入等,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
MATLAB "slice"切片功能实现四维显示
利用MATLAB 7.0的"slice"切片功能将三维表示的数据,通过对图形的线型、立面、色彩、渲染、光线、视角等的控制,可形象表现数据四维特性。
go语言中切片 slice
参考文章: https://studygolang.com/articles/18194?fr=sidebar https://github.com/cch123/golang-notes/blob/master/slice.md https://blog.haohtml.com/archives/18094 slice: 先看一下slcie结构: runtime/slice.go type slice struct { array unsafe.Pointer len int cap int } slice三要素: type、len、cap slice 的底
浅谈golang slice 切片原理
slice介绍 数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。在初始定义数组时,我们并不知道需要多大的数组,因此我们就需要“动态数组”。在Go里面这种数据结构叫slice,slice并不是真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层array,slice的声明也可以像array一样,只是不需要长度,它是可变长的,可以随时往slice里面加数据。 初看起来,数组切片就像一个指向数组的指针,实际上它拥有自己的数据结构,而不仅仅是个指针。数组切片的数据结构可以抽象为以下3个变量: 1.一个指向原生数


