• 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)
        }

     输出结果:

  • 相关阅读:
    【BZOJ5298】【CQOI2018】交错序列(矩阵快速幂优化dp)
    【BZOJ5297】【CQOI2018】社交网络(有向图生成树计数)
    【BZOJ5296】【CQOI2018】破解D-H协议(BSGS)
    【BZOJ1185】【HNOI2007】最小矩形覆盖(凸包+旋转卡壳)
    【BZOJ1069】【SCOI2007】—最大土地面积(凸包+旋转卡壳)
    【BZOJ2300】【HAOI2011】—防线修建(set维护动态凸包)
    【POJ1912】【Ceoi2002】—A highway and the seven dwarfs(凸包)
    【BZOJ1043】【HAOI2008】—下落的圆盘(圆的并集)
    node-多进程
    Node-RESTful
  • 原文地址:https://www.cnblogs.com/virgosnail/p/12936845.html
Copyright © 2020-2023  润新知