zoukankan      html  css  js  c++  java
  • Go切片

    切片

    1. 概念

      1. 与数组类似,也叫做变长数组或动态数组
      2. 引用类型,因为它指向一个底层的数组
    2. 语法

      1. 定义切片

        var slicename []type //不需要说明切片的长度
        
        var slicename = []int{1,2,3} //直接初始化
        

        使用make创建切片

        func make(Type, size ...IntegerType) Type
        1.内建函数make分配并初始化一个类型为切片、映射、或通道的对象
        2.第一个实参为类型
        3.第二个参数为长度,实际存储元素的数量,只有在长度的范围内才会初始化零值
        4.第三个参数为容量,容量是指最多能存储多少个数据
        5.长度必须<=容量
        6.通过下标只能读写长度范围内的数据
        7.只能通过append向切片追加数据
        
        var silename = make([]int,3,5)
        
        func append(slice []Type, elems ...Type) []Type
        1.内建函数append将元素追加到切片的末尾。
        2.若它有足够的容量,就在末尾追加数据。
        3.否则,就会分配一个新的基本数组(成倍数的扩充容量,)
        
        append可以将一个切片追加到另一个切片里,但是不能使用append(slice1,slice2)的形式,因为slice2是个切片,append函数要求只能是type元素,所以合法的写法是append(slice1,slice2...)
        func append(slice []Type,otherSlice... []Type) []Type
        

        从已有数组上直接创建切片

        //array直接就是slice的底层数组
        array := [...]int{1,2,3}
        slice := array[start:end] //左闭右开, array[start]~array[end-1]
        slice := array[start:] //array[start]~最后一个元素
        slice := array[:end] //第一个元素~array[end-1]
        slice := array[:] //全部的array元素
        
        切片长度: 切片对应数组片段的长度
        切片容量: 切片第一个元素在数组中的起始位置到数组最后一个元素的长度
        
      2. 遍历切片

        for i := 0 ; i < len(slice) ;i++ {}
        
        for index,value := range slice {}
        
    3. 内存分析

      1. 切片是引用类型的数据,也就是数据里存储的内存地址
      2. slice创建的过程
        1. 先创建底层数组
        2. 把数组地址赋值给切片变量
      3. 因为slice是引用类型,存储的数组地址,所以可以直接使用%p占位符打印
      4. 切片的地址也就是引用的数组的第一个切片元素的地址
      5. 每一个切片引用一个底层数组
      6. 切片本身不存储任何数据,都是底层数组存储数据,所以修改切片也就是修改这个数组中的数据
      7. 当向切片添加数据时,如果没有超过容量就直接添加,如果超过容量就自动创建一个扩容底层数组。
        扩容的规则是:如果扩容到2倍cap满足就扩容到2倍,否则就扩容到2*cap< len < 最小的2n
      8. 切片一旦扩容,就重新指向一个新的底层数组
    4. 修改底层数组

      1. 因为所有的切片变量指向同一个底层数组,所以修改底层数组数据,所有的切片都能看到
      2. 同样道理,通过切片修改元素,底层数组和其他指向同一底层数组的切片,也都能看到
      3. 通过append修改切片,实质也是在切片的底层数组指定位置追加或覆盖数据,在不扩容的情况下,底层数组或其他切片变量也能看到;如果发生了扩容,执行了append函数的切片更换了底层数组,旧底层数组和其他切片不会看到追加数据
    5. 数据类型小结

      按照类型来分:

      ​ 基本类型:int,float ,string ,bool

      ​ 复合类型:array, slice ,map , struct ,pointer , function, chan

      按照特点来分:

      ​ 值类型:int ,float,string,bool,array

      ​ 传递的是数据的副本

      ​ 引用类型:Slice

      ​ 传递地址,多个变量指向同一块内存地址

  • 相关阅读:
    go语言基本语法
    go语言学习
    Dockerfile简单实战
    Dockerfile构建命令
    docker安装prometheus grafana监控
    docker kali安装及复现永恒之蓝漏洞
    Windows系统实用快捷键
    python pip修改国内源
    网络基础——子网掩码及网络划分
    OSI七层模型简单概念及相关面试题
  • 原文地址:https://www.cnblogs.com/henryno12/p/12377631.html
Copyright © 2011-2022 走看看