zoukankan      html  css  js  c++  java
  • (二十六)golang--切片


    基本介绍:

    • 切片是数组的引用;
    • 切片的使用和数组类似;
    • 切片的长度是可以变化的;
    • 切片的定义 var a []int,注意和数组定义的区别;

    切片不仅可以使用len函数,还有cap函数来计算切片的容量;

    切片在内存中的形式:

     

     从该图我们可以得出:

    • slice的确是一个引用类型;
    • slice从底层来说,其实就是一个数据结构struct:
      type slice sruct {
        ptr *[2]int
        len int
        cap int
      }

    切片使用的三种方式:

    • 即上面的对数组的操作;
    • 通过make来创建切片;var slice []int = make([]int,4,20)三个参数分别是类型,长度,容量
    • 定义一个切片,直接就指定数组;var slice []int = []int{1,3,5}

    方式1和方式2的区别:

    方式1是直接引用数组,这个数组是事先存在的,程序员是可见的;方式2通过make,make也会创建一个数组,是由切片在底层进行维护,对程序员是不可见的;

    切片的遍历:与数组一样,也是有两种;

     切片使用的注意事项:

    • 切片定义后需要引用到一个数组或者make一个空间供切片使用;
    • 切片之后可以继续切片;
    • append内置函数,可以动态增加切片;
      var slice []int = []int{1,2,3}
      slice = append(slice,4,5,6)
      slice = append(slice,slice...);注意三个...是固定操作

    切片append底层原理分析:
    (1)切片append本质上是对数组扩容;

    (2)go语言会创建一个新的数组(扩容后)

    (3)将slice原来包含的元素拷贝到新的数组;

    (4)slice重新引用到新数组;

    (5)新数组是在底层来维护的,程序员不可见;

    切片的拷贝操作:
    切片使用copy内置函数完成拷贝;

    intArr和intArr2空间是相互独立的,相互之间不会影响;

    若元素不够,则只拷贝一部分;

     string和切片的关系:

    (1)string底层实现是一个byte数组,因此string也可以进行切片;

    (2)string是不可变的;

    (3)如果要修改字符串,先要将string-->[]byte,或者[]rune-->修改-->重写装成string;要替换中文,用[]rune;

  • 相关阅读:
    2016.6.13 php与MySQL数据库交互之数据库中的商品信息展示
    2016.6.12 计算机网络复习重点第二章之信道复用技术
    2016.6.10 计算机网络复习要点第二章物理层
    2016.6.11 ASP提交数据到SQL server数据乱码解决方法
    2016.6.6 计算机网络考试要点第一章之网络体系结构
    2016.6.5 计算机网络考试要点第一章之计算机网络性能
    tornado之Hello world
    Python执行show slave status输出的两个格式
    Python logging模块
    Python正则表达式指南(转)
  • 原文地址:https://www.cnblogs.com/xiximayou/p/11898900.html
Copyright © 2011-2022 走看看