zoukankan      html  css  js  c++  java
  • 8.25Go之容器之切片删除元素

    8.25Go之容器之切片删除元素

    切片删除元素的特点

    特点:

    • Go语言并没有对删除切片元素提供专用的语法或者接口,需要使用切片本身的特性来删除元素

    删除切片的种类

    • 从开头位置删除

    • 从中间位置删除

    • 从结尾位置删除


    开头位置删除

    直接移动数据指针

    本质:

    • 需要删除开头第几个就直接创建后面的切片然后复制到原切片上

    示例:

    package main

    import "fmt"

    func main() {
    /*声明一个切片*/
    var array = []int{1,2,3,4,5,6}
    /*打印出这时候的切片长度*/
    fmt.Println(cap(array))

    array = array[2:] //保留数组2号位后的元素然后复制给原数组,可以利用cap函数看看容量的变化

    fmt.Println(cap(array), array)
    }

    原切片的长度改变了

    不移动数据指针,但是将后面的数据向开头移动

    用 append 原地完成(所谓原地完成是指在原有的切片数据对应的内存区间内完成,不会导致内存空间结构的变化)

    package main

    import "fmt"

    func main() {
    /*声明一个切片*/
    var array = []int{1, 2, 3, 4, 5, 6}
    arrays := [...]int{1,2,3,4,5,6}

    fmt.Println(array[:0]) //相当于初始化了原切片
    fmt.Println(cap(array[:0]))

    /*使用append函数给切片赋值*/
    array = append(array[:0], array[1:]...)
    /*
    将目标切片的1号索引后的值添加到初始化的自身切片中
    保证了内存区域的一致性
    */
    fmt.Println(arrays[0]) //通过数组索引找到对应的值打印出来
    fmt.Println("######")
    fmt.Println(array[0]) //打印出的是2,不是数组索引对应的值
    /*
    要注意区分数组的声明方式和切片的声明方式
    */
    fmt.Println(copy(array, array[1:]))
    fmt.Println(array)
    }

    array[:0]相当于初始化了原切片--->其本来的切片容量不变

    copy()函数删除开头元素

    package main

    import "fmt"

    func main() {
    /*声明一个切片*/
    var array = []int{1, 2, 3, 4, 5, 6}

    /*使用copy函数进行复制*/
    array = array[:copy(array, array[1:])]
    array = array[:copy(array, array[3:])]

    fmt.Println(array)
    /*
    1、利用切片的性质,从开头获取元素
    2、使用copy函数返回一个int类型的数
    1、将要删除的开头元素不包含再目标切片当中
    */
    }

    中间位置删除

    • 使用append()函数删除

    • 使用copy()函数删除


    删除中间的元素,需要对剩余的元素进行一次整体挪动,可以用 append 或 copy 原地完成

    从中间删除位置的内存方式:

    append()函数

    package main

    import "fmt"

    func main() {
    /*声明一个切片*/
    var array = []int{1, 2, 3, 4, 5, 6, 7}

    fmt.Println(array[:2])

    /*使用append方法删除中间部分的元素*/
    //删除掉元素3
    array = append(array[:2], array[3:]...)

    fmt.Println(array)
    }

    代码说明:

    要删除元素3:

    • 已知元素3的索引位置(切片的索引和数组的传统索引不一样)

    • 将元素3之前的元素作为源切片

    • 将元素3之后的元素作为目的切片

    • 使用append()函数拼接起来

    copy()函数

    package main

    import "fmt"

    func main() {
    /*声明一个切片*/
    var array = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}

    /*使用copy的方法*/
    //删除3号元素--->先把3号之后的元素复制到3号的位置上
    copy(array[:2], array[3:])
    /*
    这个时候3号元素之前的元素已经被删除了
    要再用切片的方法去保留前两位元素
    */

    fmt.Println(array)

    array = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}

    array = array[:2+copy(array[:2], array[3:])]

    fmt.Println(array)
    }

    运用不好,对copy()函数理解不深

    从尾部删除

    直接使用len()方法获取长度然后截取切片即可

    package main

    import "fmt"

    func main() {
    /*声明切片*/
    var array = []int{1, 2, 3, 4, 5, 6}

    /*对切片进行尾部删除--->使用len方法然后重新截取切片*/
    array = array[:len(array)-1]
    /*
    要删除第N个元素就-N
    */

    fmt.Println(array)
    }

    删除切片元素的本质是,以被删除元素为分界点,将前后两个部分的内存重新连接起来。

     

    It's a lonely road!!!
  • 相关阅读:
    JQuery 快速入门一篇通
    Winform 显示Gif图片
    MD5编码工具类 MD5Code.java
    Asp.Net 上传图片并生成高清晰缩略图
    winform时钟c#代码
    PHP面试题汇总
    PHP条件语句语法与示例
    Android声音播放实例代码
    html和js基础功能代码备份
    纯C#实现屏幕指定区域截屏
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15187943.html
Copyright © 2011-2022 走看看