• Go语言的切片


    Go 语言切片(Slice)

    Go 语言切片是对数组的抽象。

    Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

    定义切片

    你可以声明一个未指定大小的数组来定义切片:

    var identifier []type

    切片不需要说明长度。

    或使用make()函数来创建切片:

    var slice1  = make([] type, len)

    或者写成如下
    slice1 := make([] type, len)

    也可以指定容量,其中capacity为可选参数

    slice1 := make([] type, len, capacity)

    切片的实例

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 func main() {
     8     //初始化数组blance,元素为1,2,3,4,5,6
     9     var blance = [] int{1, 2, 3, 4, 5, 6}
    10     //初始化数组slice1因为没有给值,所以默认填充了3个0
    11     var slice1 = make([] int,3 ,5)
    12 
    13     //输出数组的初始化的值
    14     fmt.Println("初始化数组blance的值:", blance)
    15     fmt.Println("初始化数组slice1的值:", slice1)
    16 
    17     //切片的操作,可以通过索引取值
    18     fmt.Println("blance数组中第二个索引的值为:",blance[2])
    19 
    20     //修改blance数组中最后一个值
    21     blance[5] = 10000
    22     fmt.Println("修改blance数组最后一个值以后的结果:",blance)
    23 
    24     //使用切片给s数组赋值,从blance数组中的第0个索引取到第三个索引,但不包含第三个索引的值
    25     s := blance[:3]
    26     fmt.Println("blance数组切片获取的数组s的值:", s)
    27 
    28 }

    以上代码执行的结果:

    初始化数组blance的值: [1 2 3 4 5 6]
    初始化数组slice1的值: [0 0 0]
    blance数组中第二个索引的值为: 3
    修改blance数组最后一个值以后的结果: [1 2 3 4 5 10000]
    blance数组切片获取的数组s的值: [1 2 3]

    len() 和 cap() 函数

    切片是可索引的,并且可以由 len() 方法获取长度。

    切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 //len可以获取数组的总长度,cap可以获取切片最大的长度
     8 func printSlice(x [] int,name string ){
     9     fmt.Printf("len=%d cap=%d %v=%v 
    ", len(x), cap(x) ,name , x )
    10     fmt.Println("--------------------------------")
    11 }
    12 
    13 func main() {
    14     //初始化数组blance,元素为1,2,3,4,5,6
    15     var blance = [] int{1, 2, 3, 4, 5, 6}
    16 
    17     //调用打印切片的函数
    18     printSlice(blance,"blance")
    19 
    20     //初始化一次数组最大长度为8个,初始化填充3个0的数组s
    21     s := make([] int,3 ,8)
    22     fmt.Println("初始化数组s的值为:", s)
    23 
    24     //调用打印切片的函数
    25     printSlice(s,"s")
    26 
    27 }

    以上代码执行的结果:

    len=6 cap=6 blance=[1 2 3 4 5 6] 
    --------------------------------
    初始化数组s的值为: [0 0 0]
    len=3 cap=8 s=[0 0 0] 
    --------------------------------

    append() 和 copy() 函数

    如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。

    下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 //len可以获取数组的总长度,cap可以获取切片最大的长度
     8 func printSlice(x [] int,name string ){
     9     fmt.Printf("len=%d cap=%d %v=%v 
    ", len(x), cap(x) ,name , x )
    10     fmt.Println("--------------------------------")
    11 }
    12 
    13 func main() {
    14     var numbers [] int
    15     printSlice(numbers,"numbers")
    16 
    17     //追加空切片
    18     numbers = append(numbers,)
    19     printSlice(numbers,"numbers")
    20 
    21     //追加一个元素
    22     numbers = append(numbers,1)
    23     printSlice(numbers,"numbers")
    24 
    25     //同时追加多个元素
    26     numbers = append(numbers,9, 9, 81)
    27     printSlice(numbers,"numbers")
    28 
    29     //创建n1数组是numbers的两倍的容量
    30     n1 := make([] int, len(numbers), len(numbers)*2)
    31     printSlice(n1,"n1")
    32 
    33     //拷贝numbers数组中的内容到n1中,会在对应的索引的地方覆盖已有的内容
    34     copy(n1, numbers)
    35     printSlice(n1,"n1")
    36 
    37     //声明局部数据test,初始化元素两个2,数组允许最大3个元素
    38     test := make([] int,2,3)
    39     printSlice(test,"test")
    40     //往test数组中添加数据,因为超过了最大长度的3个,go会维持内存,会另外申请一个乘以最大容量*2的容量赋值给test数组
    41     test = append(test,1, 2 ,3)
    42     printSlice(test,"test")
    43 }

    以上代码执行的结果:

    len=0 cap=0 numbers=[] 
    --------------------------------
    len=0 cap=0 numbers=[] 
    --------------------------------
    len=1 cap=1 numbers=[1] 
    --------------------------------
    len=4 cap=4 numbers=[1 9 9 81] 
    --------------------------------
    len=4 cap=8 n1=[0 0 0 0] 
    --------------------------------
    len=4 cap=8 n1=[1 9 9 81] 
    --------------------------------
    len=2 cap=3 test=[0 0] 
    --------------------------------
    len=5 cap=6 test=[0 0 1 2 3] 
    --------------------------------
  • 相关阅读:
    Java day03第三课流程控制
    java day02第二课基本数据类型、修饰符、运算符
    Objective-C 枚举类型和字符串互转方案
    UISlider
    ios中AES和RSA 加密
    1. SEL和IMP(动态性)
    《iOS开发进阶》
    【旧事重提】iOS中文件读写
    Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
    Unity3D 与 Xcode的结合
  • 原文地址:https://www.cnblogs.com/demon89/p/7259438.html
Copyright © 2020-2023  润新知