• 【愚公系列】2022年07月 Go教学课程 021-Go容器之切片操作



    一、切片操作

    1.什么是切片

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

    2.切片的定义

    2.1 切片的格式

    var 变量名 []T //T 表示切片类型。
    
    • 1

    相关案例:

    package main
    
    import "fmt"
    
    func main()  {
    	// 声明整型切片
    	var numList []int
    
    	// 声明字符串切片
    	var strList []string
    
    	// 声明一个空切片, {} 表示已经分配内存,但是切片里面的元素是空的
    	var numListEmpty = []int{}
    
    	// 输出3个切片
    	fmt.Println(numList, strList, numListEmpty)
    
    	// 输出3个切片大小
    	fmt.Println(len(numList), len(strList), len(numListEmpty))
    
    	// 切片判定是否为空结果
    	fmt.Println(numList == nil)
    	fmt.Println(strList == nil)
    	fmt.Println(numListEmpty == nil)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    2.2 make() 函数定义元素

    //T : 切片中元素的类型;
    //size : 表示为这个类型分配多少个元素;
    //cap : 预分配的元素数量,该值设定后不影响 size, 表示提前分配的空间,设置它主要用于降低动态扩容时,造成的性能问题。
    make( []T, size, cap )
    
    • 1
    • 2
    • 3
    • 4

    相关案例:

    package main
    
    import "fmt"
    
    func main() {
    	a := make([]int, 10)
    	b := make([]int, 10, 20)
    
    	fmt.Println(a, b)
    	fmt.Println(len(a), len(b))
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    3.append() 函数增加元素

    Go 语言中的内置函数 append() 可以为切片动态添加元素, 案例如下:

    package main
    
    import "fmt"
    
    func main() {
    	// 声明一个字符串类型的切片
    	var strList []string
    
    	// 循环动态向 strList 切片中添加 20 个元素,并打印相关参数
    	for i := 0; i < 10; i++ {
    		line := fmt.Sprintf("愚公 %d", i)
    		strList = append(strList, line)
    
    		fmt.Printf("len: %d, cap: %d, pointer: %p, content: %s\n", len(strList), cap(strList), strList, strList[i])
    	}
    
    	// 添加切片
    	list := []string{"愚公 10", "愚公 11"}
    	// list 后面的 ... 表示将 list 整个添加到 strList 切片中
    	strList = append(strList, list...)
    
    	fmt.Println(strList)
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    4.切片截取

    slice [开始位置:结束位置]
    
    • 1
    • slice 表示切片。
    • 开始位置和结束位置对应目标切片的下标。

    相关案例:

    package main
    
    import "fmt"
    
    func main() {
    
    	// 添加切片
    	list := []string{"愚公 10", "愚公 11", "愚公 12"}
    	// list 后面的 ... 表示将 list 整个添加到 strList 切片中
    	fmt.Println(list, list[1:2])
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    package main
    
    import "fmt"
    
    func main() {
    
    	// 添加切片
    	list := []string{"愚公 10", "愚公 11", "愚公 12"}
    	// list 后面的 ... 表示将 list 整个添加到 strList 切片中
    	fmt.Println(list, list[1:2], list[1:], list[:2], list[:])
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    • 若不填写结束位置,如 list[1:], 则表示从下标 1 置到数组的结束位置。
    • 若不填写开始位置,如 list[:2],则表示从 0 到下标 2的位置。
    • 若开始位置和结束位置都不填写,如 list[:], 则会生成一个和原有切片一样的切片。

    5.切片复制

    copy( 原切片, 目标切片 []T) int
    
    • 1

    相关案例:

    package main
    
    import "fmt"
    
    func main() {
    	// 设置元素数量为 10
    	const count = 10
    
    	// 源分片
    	list1 := make([]int, count)
    
    	// 给源分片赋值
    	for i := 0; i < count; i++ {
    		list1[i] = i
    	}
    
    	// 目标分片
    	list2 := make([]int, count)
    
    	// 将 srcSlice 分片的数据复制到 destSlice 中
    	copy(list2, list1)
    
    	fmt.Println(list1)
    	fmt.Println(list2)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述

    6.切片删除

    Go 语言中并没有提供特定的函数来删除切片中元素,可以利用append来实现切片拼接来删除。

    package main
    
    import "fmt"
    
    func main() {
    	// 声明一个字符串类型的切片
    	arr := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}
    
    	// 打印删除位置之前和之后的元素, arr[:index] 表示的是被删除元素的前面部分数据,arr[index+1:] 表示的是被删除元素后面的数据
    	fmt.Println(arr[:1], arr[2:])
    
    	// 将删除点前后的元素拼接起来
    	arr = append(arr[:1], arr[2:]...)
    
    	fmt.Println(arr)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

  • 相关阅读:
    题目地址(834. 树中距离之和)
    HTML5基础:label,select,textarea
    【JavaScript】-- 数组去重的方法
    LiveGBS流媒体平台GB/T28181功能-国标流媒体服务同时兼容内网收流外网收流多网段设备收流
    道路空间功率谱密度与时间功率谱密度(笔记)
    数据结构:链表(2),链表面试题
    理解Python装饰器
    高等数学(第七版)同济大学 习题9-5 个人解答
    Linux基本指令(上)——“Linux”
    工业4.0 资产管理壳学习笔记(1)
  • 原文地址:https://blog.csdn.net/aa2528877987/article/details/126065661