韩国站群服务器,国金紫郡府淮北论坛,做公司网站大概多少钱,购买云服务器后怎么做网站切片底层
切片#xff08;Slice#xff09;是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活#xff0c;支持自动扩容。
切片是一个引用类型#xff0c;它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。
切片…切片底层
切片Slice是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活支持自动扩容。
切片是一个引用类型它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。
切片的本质
切片的本质就是对底层数组的封装它包含了三个信息底层数组的指针、切片的长度len和切片的容量cap。
举个例子现在有一个数组a : [8]int{0, 1, 2, 3, 4, 5, 6, 7}切片s1 : a[:5]相应示意图如下。 切片s2 : a[3:6]相应示意图如下
切片不能直接比较
切片之间是不能比较的我们不能使用操作符来判断两个切片是否含有全部相等元素。 切片唯一合法的比较操作是和nil比较。 一个nil值的切片并没有底层数组一个nil值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil例如下面的示例
var s1 []int //len(s1)0;cap(s1)0;s1nil
s2 : []int{} //len(s2)0;cap(s2)0;s2!nil
s3 : make([]int, 0) //len(s3)0;cap(s3)0;s3!nil所以要判断一个切片是否是空的要是用len(s) 0来判断不应该使用s nil来判断。
切片的扩容策略
首先判断如果新申请容量cap大于2倍的旧容量old.cap最终容量newcap就是新申请的容量cap。否则判断如果旧切片的长度小于1024则最终容量(newcap)就是旧容量(old.cap)的两倍即newcapdoublecap否则判断如果旧切片长度大于等于1024则最终容量newcap从旧容量old.cap开始循环增加原来的1/4即newcapold.cap,for {newcap newcap/4}直到最终容量newcap大于等于新申请的容量(cap)即newcap cap如果最终容量cap计算值溢出则最终容量cap就是新申请容量cap。
需要注意的是切片扩容还会根据切片中元素的类型不同而做不同的处理比如int和string类型的处理方式就不一样。
使用copy()函数复制切片
由于切片是引用类型所以a和b其实都指向了同一块内存地址。修改b的同时a的值也会发生变化。
Go语言内建的copy()函数可以迅速地将一个切片的数据复制到另外一个切片空间中copy()函数的使用格式如下
copy(destSlice, srcSlice []T)其中
srcSlice: 数据来源切片destSlice: 目标切片
从切片中删除元素
Go语言中并没有删除切片元素的专用方法我们可以使用切片本身的特性来删除元素。 代码如下
func main() {// 从切片中删除元素a : []int{30, 31, 32, 33, 34, 35, 36, 37}// 要删除索引为2的元素a append(a[:2], a[3:]...)fmt.Println(a) //[30 31 33 34 35 36 37]
}总结一下就是要从切片a中删除索引为index的元素操作方法是a append(a[:index], a[index1:]...)
package mainimport fmtfunc main() {var a make([]string, 5, 10)for i : 0; i 10; i {a append(a, fmt.Sprintf(%v, i))}fmt.Println(a)
}