go:slice(切片)

1. 简介

  切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(本身就是一个指针,不能用指针指向 slice)。

  这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。

  切片的类型为 [] T,与数组的区别为切片类型不包含 长度;

  使用切片时,切片下标不能超过切片长度的范围(0<= index <len)

2. 创建切片

  创建切片可以基于现有数组创建,也可以通过 make 函数创建

    // make 函数创建切片
    // 指定切片长度和容量
    var slice = make([]int,5)
    // 输出:slice type=[]int, len=5, cap=5,value=[0 0 0 0 0] 
    fmt.Printf("slice type=%T, len=%d, cap=%d,value=%v 
",slice,len(slice),cap(slice), slice)

    // 指定切片长度,容量未指定时默认等于长度
    slice = make([]int,3,5)
    // 输出:slice type=[]int, len=3, cap=5,value=[0 0 0] 
    fmt.Printf("slice type=%T, len=%d, cap=%d,value=%v 
",slice,len(slice),cap(slice), slice)

    // 基于数组生成切片
    var array = [5]int {1,2,3,4,5}
    // 输出:array type=[5]int,len=5, cap=5,value=[1 2 3 4 5]
    fmt.Printf("array type=%T,len=%d, cap=%d,value=%v 
",array,len(array),cap(array), array)

    // 前闭后开
    var slice2 = array[2:3]
    // 输出:slice2 type=[]int,len=1, cap=3,value=[3]
    fmt.Printf("slice2 type=%T,len=%d, cap=%d,value=%v 
",slice2,len(slice2),cap(slice2), slice2)

3 修改切片

3.1 修改切片区间

  切片修改时不能超过切片的容量,超过容量时就需要创建一个更大的切片;

    // 相当于引用的区间为 0:3,前闭后开
    slice = make([]int,3,5)
    for i := 0; i < len(slice); i++ {
        slice[i] = i
    }
    // 省略起始位置时,默认为原来的起始位置
    slice2 = slice[:4]
    // 输出:slice2 type=[]int,len=4, cap=5,value=[0 1 2 0]
    fmt.Printf("slice2 type=%T,len=%d, cap=%d,value=%v 
",slice2,len(slice2),cap(slice2), slice2)
    // 省略结束位置时,默认为原来的结束位置
    slice2 = slice[1:]
    // 输出:slice2 type=[]int,len=2, cap=4,value=[1 2]
    fmt.Printf("slice2 type=%T,len=%d, cap=%d,value=%v 
",slice2,len(slice2),cap(slice2), slice2)
    // 重新定义起始区间位置
    slice2 = slice[0:5]
    // 输出:slice2 type=[]int,len=5, cap=5,value=[0 1 2 0 0]
    fmt.Printf("slice2 type=%T,len=%d, cap=%d,value=%v 
",slice2,len(slice2),cap(slice2), slice2)

3.2 追加元素

  内置 append 函数向切片中追加元素,类似于Java的List,超出容量后,可以动态扩容

    var slice = make([]int,3,5)
    slice = append(slice, 1, 2, 3)
    // slice type=[]int, len=6, cap=10,value=[0 0 0 1 2 3]
    fmt.Printf("slice type=%T, len=%d, cap=%d,value=%v 
",slice,len(slice),cap(slice), slice)

3.3 复制切片

  内置 copy 函数可以将一个切片的蒜素复制到另一个切片;

  copy(dst,src),返回复制的元素个数

  dst:目的切片,src:源切片

    var array = [3]int{1,2,3}
    var slice = array[0:3]
    fmt.Println(slice)
    var slice2  = make([]int,6,6)
    num := copy(slice2, slice)
    fmt.Println(num)
    fmt.Println(slice2)

输出结果:

 4. 基本应用

4.1 字符串生成切片

    str:="golang"
    bytes:=[]byte(str)
    // 打印 bytes 的类型和值
    fmt.Printf("bytes: type=%T,value=%v 
",bytes,bytes)
    // 以字符形式打印每个元素
    for _, value := range bytes {
        fmt.Printf("%c ",value)
    }

 输出结果:

原文地址:https://www.cnblogs.com/virgosnail/p/12936845.html