• Go数据类型之复合数据类型--Slice


    3.2 Slice

      一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。
      一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素
    并不一定就是数组的第一个元素。长度对应slice中元素的数目;长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。
    内置的len和cap函数分别返回slice的长度和容量。多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠。

    3.2.1 创建Slice

    1、make
    使用make时,需要传入一个参数,指定切片的长度。

    slice := make([]string, 5)    //创建一个字符串切片,长度和容量都是5个元素
    slice := make([]string, 3, 5) //创建一个字符串切片,长度为3,容量为5

    2、切片字面量来声明切片

    slice := []int{10, 20, 30}  //创建一个整型切片,长度和容量都是3个元素
    slice := []string{99: “”}   //创建字符串切片,使用空字符串初始化第100个元素

    3、nil切片
    nil在底层数组包含0个元素,也没有分配任何存储空间,长度为0,容量为0。

    var slice []int //创建nil整形切片
    slice := make([]int, 0) //使用make创建空的整型切片
    slice := []int{} //使用切面字面量创建空的整形切片

    3.2.2 使用切片

    1、赋值和切片

    //创建一个整形切片
    slice := []int{10, 20, 30, 40, 50}
    //创建一个新切片,长度为2,容量为4(从索引1开始,之前的元素对它而言不存在)
    newSlice := slice[1:3]

      对底层数组容量是k的切片slice[i:j]来说:
      长度: j – i

       容量: k – I
    2、使用append向切片增加元素
      请看下面代码:

    package main
    
    import "fmt"
    
    func main() {
    //创建一个整形切片
    slice := []int{10, 20, 30, 40, 50}
    fmt.Println("slice is:", slice)
    
    //创建一个新切片,长度为2,容量为4
    newSlice := slice[1:3]
    fmt.Println("newSlice is:",newSlice)
    
    //对newSlice追加新元素,长度为3,容量为4
    newSlice = append(newSlice, 60)
    fmt.Println("newSlice append is:", newSlice)
    
    fmt.Println("now slice is:", slice)
    }

    运行结果:
      slice is: [10 20 30 40 50]
      newSlice is: [20 30]
      newSlice append is: [20 30 60]
      now slice is: [10 20 30 60 50]

      slice和newSlice共享同一段底层数组,newSlice是从索引1的位置开始,因此对newSlice进行append时,其实是修改slice的第四个数值,从打印结果我们也可以得出这样的结论。
      slice和newSlice共享同一段底层数组,但通过不同的切片会看到底层数组的不同部分。如果一个切片修改了该底层数组的共享部分,另一个切片也能感知到。

  • 相关阅读:
    [Docker] redis 全配置
    Dubbo的负载均衡策略&容错策略
    Dubbo部分知识点总结
    如何win10 上访问虚拟机(linux)上redis方法
    Linux_centOS_5.7_64下如何安装jdk1.8&mysql
    java高级&资深&专家面试题-行走江湖必备-持续更新ing
    springCloud微服务调用失败【CannotGetJdbcConnectionException: Failed to obtain JDBC Connection】
    synchronized、volatile区别、synchronized锁粒度、模拟死锁场景、原子性与可见性
    ThreadLocal什么时候会出现OOM的情况?为什么?
    volatile、ThreadLocal的使用场景和原理
  • 原文地址:https://www.cnblogs.com/ralap7/p/9170590.html
Copyright © 2020-2023  润新知