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

举报
愚公搬代码 发表于 2022/07/31 16:22:40 2022/07/31
【摘要】 一、切片操作 1.什么是切片切片和数组类似,都是数据集合。和数组不同的是,切片是一块动态分配大小的连续空间。 2.切片的定义 2.1 切片的格式var 变量名 []T //T 表示切片类型。相关案例:package mainimport "fmt"func main() { // 声明整型切片 var numList []int // 声明字符串切片 var strList []stri...

一、切片操作

1.什么是切片

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

2.切片的定义

2.1 切片的格式

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

相关案例:

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)
}

在这里插入图片描述

2.2 make() 函数定义元素

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

相关案例:

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))
}

在这里插入图片描述

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)
}


在这里插入图片描述

4.切片截取

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

相关案例:

package main

import "fmt"

func main() {

	// 添加切片
	list := []string{"愚公 10", "愚公 11", "愚公 12"}
	// list 后面的 ... 表示将 list 整个添加到 strList 切片中
	fmt.Println(list, list[1:2])
}

在这里插入图片描述

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[:])
}

在这里插入图片描述

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

5.切片复制

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

相关案例:

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)
}

在这里插入图片描述

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)
}

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。