Golang面试字符串、数组、切片知识( 二 )


  • 引用类型 。 但自身是结构体 , 值拷贝传递 。
  • 属性len表示可用元素数量 , 读写操作不能超过该限制 。
  • 属性cap表示最大扩张容量 , 不能超出数组限制 。
  • 如果slice==nil,那么len、cap结果都等于0 。
理解len&cap的实例:
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} slice := data[1:4:5]//[low:hight:max]
Golang面试字符串、数组、切片知识文章插图
slice len cap 用法
切片的创建使用语法:
make([]Type, length, capacity)make([]Type, length)[]Type{}[]Type{value1, value2, ..., valueN}使用切片特别注意:
  • 切片的读写实际上对应的是底层的数组;
  • 新切片依旧指向原底层数组 。
  • 向 slice 尾部添加数据 , 返回新的 slice 对象 。
  • 切片一旦超出原 slice.cap 限制 , 就会重新分配底层数组 , 即便原数组并未填满 。 通常以 2 倍容量重新分配底层数组 。 在?大批量添加数据时 , 建议?一次性分配?足够?大的空间 , 以减少内存分配和数据复制开销 。 或初始化?足够?长的 len 属性 , 改?用索引号进?行操作 。 及时释放不再使?用的 slice 对象 , 避免持有过期数组 , 造成 GC ?无法回收 。
在某些情况下 , 我们可以简单地对新切片进行操作,创建新的更大的切片; 将原始切片的内容复制到其中; 将旧切片分配给新切片 。
对切片操作Copy和 Append 两个内置函数:
Slice Copy格式 , 在切片的末尾附加新元素 , 如果需要更大的容量 , 则增大切片 。
copy(destination, source []T) intSlice Copy实例 , 让我们创建slice并增加其容量 。
s := []int{1,2,3}// creates slice s == [1 2 3]t := make([]int, len(s), cap(s)*2)// creates new slice t, filled// with zero-values (0s for// int), of specified length// and capacitycopy(t, s)s = t// cap(s) == 3// cap(t) == 6Slice Append 格式
append(slice []Type, elements...Type) []TypeSlice Append实例 , 让我们将一个切片附加到另一个切片上 , 甚至不用担心其容量
a := []string{"a", "b", "c"}b := []string{"x", "y", "z"}a = append(a,b...) // equivalent to "append(a, b[0], b[1], b[2])"//let's print it!fmt.Printf("%d %v", cap(a), a)// 6 [a b c x y z]