【高级数据类型】- 3. 切片的更多操做方法

咱们已经知道,在进行“切片”操做的时候须要指定元素下界索引和元素上界索引,就像这样:数组

numbers3[1:4]

    在有些时候,咱们还能够在方括号中放入第三个正整数,以下所示:安全

numbers3[1:4:4]

    这第三个正整数被称为容量上界索引。它的意义在于能够把做为结果的切片值的容量设置得更小。换句话说,它能够限制咱们经过这个切片值对其底层数组中的更多元素的访问。下面举个例子。让咱们先来回顾下在上一节讲到的numbers3slice1。针对它们的赋值语句是这样的:app

var numbers3 = [5]int{1, 2, 3, 4, 5}
var slice1 = numbers3[1:4]

    这时,变量slice1的值是[]int{2, 3, 4}。可是咱们能够经过以下操做将其长度延展得与其容量相同:函数

slice1 = slice1[:cap(slice1)]

    经过此操做,变量slice1的值变为了[]int{2, 3, 4, 5},且其长度和容量均为4。如今,numbers3的值中的索引值在[1,5)范围内的元素都被体如今了slice1的值中。这是以numbers3的值是slice1的值的底层数组为前提的。这意味着,咱们能够垂手可得地经过切片值访问其底层数组中对应索引值更大的更多元素。若是咱们编写的函数返回了这样一个切片值,那么获得它的程序极可能会经过这种技巧访问到本不该该暴露给它的元素。这是确确实实是一个安全隐患。
  
    若是咱们在切片表达式中加入了第三个索引(即容量上界索引),如:code

var slice1 = numbers3[1:4:4]

    那么在这以后,不管咱们怎样作都没法经过slice1访问到numbers3的值中的第五个元素。由于这超出了咱们刚刚设定的slice1的容量。若是咱们指定的元素上界索引或容量上界索引超出了被操做对象的容量,那么就会引起一个运行时恐慌(程序异常的一种),而不会有求值结果返回。所以,这是一个有力的访问控制手段。
  
    虽然切片值在上述方面受到了其容量的限制,可是咱们却能够经过另一种手段对其进行不受任何限制地扩展。这须要使用到内建函数appendappend会对切片值进行扩展并返回一个新的切片值。使用方法以下:对象

slice1 = append(slice1, 6, 7)

    经过上述操做,slice1的值变为了[]int{2, 3, 4, 6, 7}。注意,一旦扩展操做超出了被操做的切片值的容量,那么该切片的底层数组就会被自动更换。这也使得经过设定容量上界索引来对其底层数组进行访问控制的方法更加严谨了。
  
    咱们要介绍的最后一种操做切片值的方法是“复制”。该操做的实施方法是调用copy函数。该函数接受两个类型相同的切片值做为参数,并会把第二个参数值中的元素复制到第一个参数值中的相应位置(索引值相同)上。这里有两点须要注意:
  
  1. 这种复制遵循最小复制原则,即:被复制的元素的个数老是等于长度较短的那个参数值的长度。
  2. 与append函数不一样,copy函数会直接对其第一个参数值进行修改。
  
      举例以下:索引

var slice4 = []int{0, 0, 0, 0, 0, 0, 0}
copy(slice4, slice1)

    经过上述复制操做,slice4会变为[]int{2, 3, 4, 6, 7, 0, 0}变量

相关文章
相关标签/搜索