存储结构:
1、切片
切片是Go中重要的数据类型,每个切片对象内部都维护着:数组指针(切片的地址)、切片长度、切片容量三个数据
长度是目前存储的数量,容量是最大存储数量
在向切片中追加的数据个数大于容量时,内部会自动扩容且每次扩容都当前容量的两倍(当容量超过1024时每次扩容则只增加当前容量的1/4容量),注意扩容之后地址会改变
var users = make([]int,2,5) //三个参数,第一个是切片的数据类型,第二个是初始化长度(刚开始存储的默认几个数据),第三个是容量(推荐)
v3 := append(users,99) //指向的地址是一样的,但len不同,所以修改V3第一个数据users也会变
往一个切片里面添加一个数据
切片的常见操作:
长度和容量:
len(v1)\cap(v1)
索引:
根据长度确定索引,根据索引获取值并且可以修改值
············
切片:切片得到的切片的内部数据地址是一致的
v2 := v1[1:3]
追加:append
删除:
//切片取前几位的时候地址是相同的
//但是后面赋值相当于给后面的覆盖掉了,所以v1也变了,但删除一位之后相当于最后会有重复的值
插入:
但是这种插入效率低下,所以插入操作尽可能不要用切片,用链表或者循环
变量赋值:
这种地址是不同的
整型、布尔类型、浮点型、字符串:
赋值也是重新开辟内存存储数据
数组:也是重新开辟内存,修改一者另一者不变
切片虽然地址不同,但是他内部存储的指针依然指向的是同一块地址,但是如果扩容的话就会重新开辟区域了
所以,目前学到的数据类型中,只有切片在修改内部元素时,会造成所有的赋值变量同时修改(不扩容的情况下)
切片和数组的区别:
切片修改数据时会导致所有赋值变量同时修改,且切片会自动扩容,数组在声明的时候容量定死了