(二十六)golang--切片


基本介绍:程序员

  • 切片是数组的引用;
  • 切片的使用和数组相似;
  • 切片的长度是能够变化的;
  • 切片的定义 var a []int,注意和数组定义的区别;

切片不只能够使用len函数,还有cap函数来计算切片的容量;数组

切片在内存中的形式:数据结构

 

 

 

 

 

 从该图咱们能够得出:app

  • slice的确是一个引用类型;
  • slice从底层来讲,其实就是一个数据结构struct:
    type slice sruct {
      ptr *[2]int
      len int
      cap int
    }

切片使用的三种方式:ide

  • 即上面的对数组的操做;
  • 经过make来建立切片;var slice []int = make([]int,4,20)三个参数分别是类型,长度,容量
  • 定义一个切片,直接就指定数组;var slice []int = []int{1,3,5}

方式1和方式2的区别:函数

方式1是直接引用数组,这个数组是事先存在的,程序员是可见的;方式2经过make,make也会建立一个数组,是由切片在底层进行维护,对程序员是不可见的;3d

切片的遍历:与数组同样,也是有两种;blog

 切片使用的注意事项:内存

  • 切片定义后须要引用到一个数组或者make一个空间供切片使用;
  • 切片以后能够继续切片;
  • append内置函数,能够动态增长切片;
    var slice []int = []int{1,2,3}
    slice = append(slice,4,5,6)
    slice = append(slice,slice...);注意三个...是固定操做

切片append底层原理分析:
(1)切片append本质上是对数组扩容;字符串

(2)go语言会建立一个新的数组(扩容后)

(3)将slice原来包含的元素拷贝到新的数组;

(4)slice从新引用到新数组;

(5)新数组是在底层来维护的,程序员不可见;

切片的拷贝操做:
切片使用copy内置函数完成拷贝;

intArr和intArr2空间是相互独立的,相互之间不会影响;

若元素不够,则只拷贝一部分;

 

 

 string和切片的关系:

(1)string底层实现是一个byte数组,所以string也能够进行切片;

(2)string是不可变的;

(3)若是要修改字符串,先要将string-->[]byte,或者[]rune-->修改-->重写装成string;要替换中文,用[]rune;

相关文章
相关标签/搜索