切片

slice

​ 是拥有相同类型元素可变长的序列,是基于数组类型做的一层封装,支持扩容。

01 定义切片

01 一般方法

package main

import "fmt"

func main(){
  var a []int
  fmt.Println(a)
}

注意:

​ 这种只声明,没有初始化,等于nil

02 数组切分

package main

import "fmt"

func main(){
  a := [9]int {1, 2, 3, 4}
  b := a[:] // b 是一个切片
  fmt.Println(a, b)
}

注意:

​ 切片切分还是切片

​ 初始化为空时,长度和容量为0,但是不等于nil

03 make函数

package main

import "fmt"

func main(){
  a := make([]int, 3, 5)   // 类型、长度、容量(可以省略,与长度一致)
  fmt.Println(a)
}

注意:

​ 长度容量为0时,不等于nil

切片的长度是len(),切片容量是cap()

02 切片用法

01 len

长度:就是元素的个数

package main

import "fmt"

func main(){
  a := [9]int {1, 2, 3, 4}
  b := a[:5] // b 是一个切片
  fmt.Println(len(b)) // 就是元素个数
}

02 cap

容量

package main

import "fmt"

func main(){
  a := [9]int {1, 2, 3, 4}
  b := a[:5] // b 是一个切片
  fmt.Println(cap(b)) // 在这里是数组的长度
}

注意:

​ 1 如果是普通声明赋值的切片,容量和长度相等

​ 2 如果是切分数组获得切片,容量不扩容的情况下,容量等于数组长度,减去切分的最小索引

​ 3 如果是make函数声明定义的切片,在不扩容的情况下,第三个参数是容量,如果省略,那么等于长度(第二个参数)

03 append

给切片添加元素,加在最后(右)

  • 加单个元素
package main

import "fmt"

func main(){
  a := make([]int, 5)
  a = append(a, 1) // 必须有变量接收,一般是添加元素的切片
  fmt.Println(a)
}

注意:

​ 1 只声明不能用append方法,要初始化

​ 2 添加的元素大于切片容量,切片会自动扩容

  • 加多个元素
package main

import "fmt"

func main(){
  a := make([]int, 5)
  a = append(a, 1, 2, 3) // 必须有变量接收,一般是添加元素的切片
  fmt.Println(a)
}
  • 两个切片元素相加
package main

import "fmt"

func main(){
  a := make([]int, 5)
  b := []int{33, 34, 35}
  a = append(a, b...) // 必须有三个点
  fmt.Println(a)
}

注意:

​ 只能是切片,不能是数组

04 删除切片中的元素

没有内置方法

package main

import "fmt"

func main(){
  a := []int{1, 2, 3, 4, 5, 6, 7}
  a = append(a[1[:3], a[4:]...])  // 删除了索引为3的元素
  fmt.Println(a)
}

注意:

​ 删除索引为n的元素,直接append(a[:n], a[n+1: ]...)

05 切片是引用赋值

切片被引用赋值,被赋值的切片发生改变,原切片也会发生变化

package main

import "fmt"

func main(){
  a := []int{1, 2, 3, 4, 5, 6, 7}
  b := a
  b[3] == 1000
  fmt.Println(a, b) // a,b 都发生变化
}

06 使用copy()复制切片

复制的切片发生变化,原切片不发生改变

package main

import "fmt"

func main(){
  a := []int{1, 2, 3, 4, 5, 6, 7}
  b := make([]int, 7)
  copy(b, a)
  b[3] = 1000
  fmt.Println(a, b) // 只有b发生改变
}

注意:

​ 要想被copy复制,只能用make声明初始化切片

07 遍历

与数组一样

package main

import "fmt"

func main(){
  a := []int {12, 13, 14, 15, 16, 17, 18}
  // for range 遍历
	for _, value := range a{
		fmt.Println(value)
	}
  // 二
  for i := 0; i < len(a); i ++{
		fmt.Println(a[i])
	}
}
posted @ 2021-03-10 10:07  tianzhh_lynn  阅读(21)  评论(0编辑  收藏  举报