go语言入门六 | 青训营笔记

69 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

slice切片

基本定义

数组长度不可变,切片补足了这个缺点,是一个动态数组,切片是数组的一个引用

var slicename [] type

  1. 切片是数组的一个引用,那么切片是一个引用类型,这和数组是不一样的,函数中改变的会改变其值
  2. 切片的长度是可以变化的
  3. 切片的使用类似于数组,遍历和访问都是和数组一样的
  4. 切片的定义基本语法: var intArr [5]int = [...]int{11,22,33,44,55} //数组 slice := intArr[1:3]
    1. slice 是切片名称
    2. intArr[1:3] 表示slice引用数组第二个元素到下标
    3. 引用intArr数组的起始下标为1,终止下标为3,但是不包含3
    4. 切片的容量cap是可变的,这样可以节约空间
    5. 此时改变数组的值,slice 的值也会发生变化(引用)

结构

可以理解为slic是一个引用类型(本身也是有个地址),slic从底层来说其实就是一个数据结构,是struct结构体

type slice struct{
    ptr *[2]int
    len int 
    cap int
}
  1. 第一个位置记录的是数组的地址,是引用类型
  2. 第二个记录了slic本身的长度
  3. 第三个记录的是slic容量的大小

使用

  1. 定义一个切片和数组,让切片去引用数组
    var intArr [5]int = [...]int{11,22,33,44,55}  //数组
    slice := intArr[1:3]
    
  2. 通过func make来创建一个切片:var 切片名 []type = make([],len,[cap])
    • type 是数据类型
    • len :切片大小
    • cap:切片容量

法一和法二的区别
1. 方式一是直接引用数组,数组是值类型,而引用的是引用类型,数组是事先存在的,程序员是可见的 1. make创建切片,这个切片是在底层中,程序员是不可见的

初始化

  1. s :=[] int {1,2,3 }:直接初始化切片,[] 表示是切片类型,{1,2,3} 初始化值依次是 1,2,3,其 cap=len=3。
  2. s := arr[startIndex:endIndex]:将 arr 中从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
  3. s := arr[:endIndex]:默认 startIndex 时将表示从 arr 的第一个元素开始。
  4. s1 := s[startIndex:endIndex]:通过切片 s 初始化切片 s1。
  5. s :=make([]int,len,cap):通过内置函数 make() 初始化切片s,[]int 标识为其元素类型为 int 的切片。

遍历

  1. 常规遍历:for遍历
  2. for range遍历

注意

  1. 通过make方式创建的切片可以指定切片的大小和容量
  2. 如果没有给切片的各个元素赋值,就会使用默认值
  3. 通过make方式创建的切片对应的数组是由make底层维护,对外部可见,只能使用slice去访问
  4. 对切片初始化后任然不能越界,但是可以动态增长

常用函数

  1. cap:容量
  2. len:长度
  3. append:追加容量
  4. copy:复制切片1->切片2
  5. string:不可变的,如果需要改变,此时将其字符串转化为切片或者run切片,再转化为字符串