← 返回首页
Go基础教程(十一)
发表时间:2022-11-23 20:43:11
切片

切片和数组类似,都是数据集合。和数组不同的是,切片是一块动态分配大小的连续空间。它和 Java 语言中的AarryList集合类似。

1.声明切片

切片的声明格式如下:

var name []T

2.切片常用方法

方法 说明
make( []T, size, cap ) 构造切片
append(slice,...elements) 往切片动态添加元素
copy( destSlice, srcSlice []T) int 将一个切片中的数据复制到另一个切片中

实例:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // 声明整型切片
    var numList []int
    // 声明字符串切片
    var citysList []string
    // 声明一个空切片, {} 表示已经分配内存,但是切片里面的元素是空的
    var numListEmpty = []int{}
    // 使用make() 函数构造切片
    var stusList = make([]string, 4, 10)
    // 输出4个切片
    fmt.Println(numList, citysList, numListEmpty, stusList)
    // 输出4个切片大小
    fmt.Println(len(numList), len(citysList), len(numListEmpty), len(stusList))

    fmt.Println("------------判定切片是否为空--------------")
    // 切片判定是否为空结果
    fmt.Println(numList == nil)
    fmt.Println(citysList == nil)
    fmt.Println(numListEmpty == nil)
    fmt.Println(stusList == nil)

    // 使用append追加新元素
    numList = append(numList, 1, 2, 3, 4, 5)
    citysList = append(citysList, "北京", "上海", "广州", "深圳")
    stusList = append(stusList, "张三", "李四", "王五")

    fmt.Println("------------切片中追加新元素后--------------")
    fmt.Println(numList)
    fmt.Println(citysList)
    fmt.Println(stusList)

    fmt.Println("---------------测试切片会自动扩容--------------")
    for i := 0; i < 10; i++ {

        //strconv.Itoa(int)方法是将int转成string
        stusList = append(stusList, "张"+strconv.Itoa(i+1))
    }
    fmt.Println(stusList)

    fmt.Println("---------------切片的拷贝--------------")
    //目标切片
    destStusSlice := make([]string, len(stusList))
    copy(destStusSlice, stusList)
    fmt.Println(destStusSlice)

    fmt.Println("-------------从指定范围中生成切片--------------")
    fmt.Println(stusList[7:]) //stusList[7:], 则表示从下标 7 置到数组的结束位置。

    fmt.Println("-----------重置切片-------------")
    stusList = stusList[0:0]
    //fmt.Println(stusList[0:0]) //重置切片
    fmt.Println(stusList)

    //Go 语言中并没有提供特定的函数来删除切片中元素,但是我们可以使用append间接实现删除功能
    fmt.Println("---------删除‘广州’----------")
    citysList = append(citysList[:2], citysList[2+1:]...)
    fmt.Println(citysList)

}

运行结果:

[] [] [] [   ]
0 0 0 4                                                       
------------判定切片是否为空--------------                    
true                                                          
true                                                          
false                                                         
false                                                         
------------切片中追加新元素后--------------                  
[1 2 3 4 5]                                                   
[北京 上海 广州 深圳]                                         
[    张三 李四 王五]                                          
---------------测试切片会自动扩容--------------               
[    张三 李四 王五 张1 张2 张3 张4 张5 张6 张7 张8 张9 张10] 
---------------切片的拷贝--------------                       
[    张三 李四 王五 张1 张2 张3 张4 张5 张6 张7 张8 张9 张10] 
-------------从指定范围中生成切片--------------               
[张1 张2 张3 张4 张5 张6 张7 张8 张9 张10]                    
-----------重置切片-------------                              
[]                                                            
---------删除‘广州’----------                                 
[北京 上海 深圳]