zoukankan      html  css  js  c++  java
  • 8.25Go之容器之切片append()

    8.25Go之容器之切片append()

    内建函数append()

    作用:

    内建函数 append() 可以为切片动态添加元素

    • 尾部添加元素

    • 头部添加元素

    • 切片扩容

    • 使用append()拼接切片


    尾部添加元素

    代码实现:

    package main

    import "fmt"

    func main() {
    /*声明一个切片*/
    var array []int

    /*追加一个元素*/
    array = append(array, 1)

    /*追加多个元素*/
    array = append(array, 1,2,3)

    /*追加一个切片*/
    array = append(array, []int{1,2,3,4,5}...)
    /*
    追加一个切片需要对追加的切片进行压缩。书写格式为:[]int{}...
    后面三个"..."符号必不可少,是压缩的标识符
    []int{1,2,3,4,5}...这个不是一个新建的数组切片对象放入array当中,而是将元素放入slice当中
    */

    fmt.Println(array)
    }

    头部添加元素

    代码实现:

    package main

    import "fmt"

    func main() {
    /*新建切片*/
    var array = []int{2,3,4}

    /*开头添加传参需要改变,并且需要对原数组进行压缩*/
    array = append([]int{0,1}, array...)
    /*
    这个操作再内存层面已经对原来的切片进行了复制扩容
    1、先复制原有的切片
    2、再创建一个更大的切片空间
    3、将添加的元素和原有的切片元素赋值进入到创建的切片空间
    */

    fmt.Println(array)
    }

    在切片开头添加元素会导致内存的重新分配,而且会导致已有元素全部被复制 1 次,从切片的开头添加元素的性能要比从尾部追加元素的性能差很多。

    切片扩容

    扩容规律:

    按容量的 2 倍数进行扩充

    package main

    import "fmt"

    func main() {
    /*声明一个切片*/
    var array []int

    /*循环往里面赋值*/
    for i := 0; i < 10; i++ {
    /*使用append函数往切片里面添加元素*/
    array = append(array, i)
    fmt.Printf("len:%d,cap:%d,pointer:%p ", len(array), cap(array), array)
    /*
    1、len函数查看切片拥有的元素个数
    2、cap函数查看切片容量情况
    */
    }
    }

    通过len()函数和cap()函数很好的反映出了容量的变化情况:

    • 容量达到上限时都按照2的倍数进行扩容

    • 切片长度 len 并不等于切片的容量 cap。

    使用append()函数拼接切片

    append()函数返回的是一个新切片,所以支持链式操作

    package main

    import "fmt"

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

    /*通过添加append的切片实现切片的拼接*/
    array = append(array[:3], append([]int{0,1}, array[1:]...)...)

    fmt.Println(array)
    }
    • 每个添加操作中的第二个 append 调用都会创建一个临时切片,并将append[i:] 的内容复制到新创建的切片中

    • 再将临时创建的切片再追加到 append[:i] 中。

    代码分析:

    • 先执行里面的append([]int{0,1}, array[1:]...)...再切片的array[1:]开头添加切片[]int{0,1}返回一个临时切片[0,1,3,4,5,6]

    • 再执行外层的append()在原切片的前3号索引[2,3,4]然后再将返回的零食切片拼接到原切片前三好索引后

    这里对切片进行了扩容:

    package main

    import "fmt"

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

    /*通过添加append的切片实现切片的拼接*/
    array = append(array[:3], append([]int{0,1}, array[1:]...)...)
    /*
    左闭右开:
    1、左边闭合的区间,左边的索引的值会取到该索引所在的位置
    2、右边开放的区间,右边索引的值会取到该索引前一位的位置
    */

    fmt.Println(array)
    fmt.Println(array[:3])
    fmt.Printf("len:%d,cap:%d,pointer:%p", len(array), cap(array), array)
    }

    cap()函数显示长度容量变成了10

    It's a lonely road!!!
  • 相关阅读:
    SQL语句获取数据库名、表名、储存过程以及参数列表 狼
    CKEditor3.3+CKFinder2.0附带CKF去除水印 狼
    media player 和realplayer 编程接口 狼
    教您如何去认识人!(识人术) 狼
    引用 JS判断浏览器类型方法 狼
    (转)初始化多维数组
    kmeans 聚类 (代码为: 博客数据聚类) (python )
    对博客订阅源URL中的单词进行计数 (仅限英文博客,中文订阅源不支持 )
    eclipse +python 修改 各种颜色 +字体
    常见错误收集: lucene 读取word文档问题
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15187939.html
Copyright © 2011-2022 走看看