在go1.2中引入了能够限制新建切片容量的三索引切分操作,允许创建新的切片,并指定这个新切片的长度和容量,什么叫三索引切分呢,看看下面的两个索引拆分后的长度和容量。
var areaSlice = []string{"广州", "北京", "上海", "深圳", "武汉", "重庆", "成都", "洛阳"}
areaSlice1 := areaSlice[1:3]
fmt.Printf("areaSlice1值%v,长度%v,容量%v,类型%T\n", areaSlice1, len(areaSlice1), cap(areaSlice1), areaSlice1)
//输出
areaSlice1值[北京 上海],长度2,容量7,类型[]string
上面案例中,对areaSlice做了从第一个元素开始,到第三个元素(不包含)切分了一个切片,在Golang笔记--切片(slice)的使用这里可以知道,出来的是一个长度为2,容量为7的这么一个切片。
而在golang的1.2以上版本,slice的切分提供了一个可限制容量的索引。
var areaSlice = []string{"广州", "北京", "上海", "深圳", "武汉", "重庆", "成都", "洛阳"}
areaSlice2 := areaSlice[1:3:5]
fmt.Printf("areaSlicea2值%v,长度%v,容量%v,类型%T\n", areaSlice2, len(areaSlice2), cap(areaSlice2), areaSlice2)
//输出
areaSlicea2值[北京 上海],长度2,容量4,类型[]string
看案例areaSlice2 := areaSlice[1:3:5],最后的5,实际上是指最后出来的容量按初始索引计算到5,不包括5,也就是出来的切片的容量是4,这样可以显式控制切片容量的大小。
小结:
1、Golang1.2版本以上允许你控制切片的容量,即底层数组的大小,通过显式设置容量限制
2、显式控制切片容量的时候,需要你确保新切片不会访问原始切片超出容量限制的部分,不然潜在的越界访问错误。
发表评论