✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑
文章目录
Go语言切片(Slice)详细用法教程
在Go语言中,切片(Slice)是一种非常强大且灵活的数据结构,它基于数组但又提供了动态调整大小的能力。切片在Go语言中非常常用,几乎成为处理序列数据的首选方式。本文将结合实际案例,详细介绍Go语言中切片的声明、初始化、操作、扩容等用法。
一、切片的定义与内部结构
1.1 切片的基本定义
切片是Go语言中对数组的抽象表示,它提供了一种动态的方式来处理序列数据。切片不是数组,但它内部包含了对数组的引用。切片拥有三个关键属性:
- 指向底层数组的指针:指向切片实际存储数据的数组。
- 切片的长度(len):切片当前包含的元素数量。
- 切片的容量(cap):从切片开始到其底层数组末尾的元素数量。
1.2 切片的声明
切片的声明有几种方式,以下是一些常见的声明方法:
- 使用
var
关键字声明切片,但不初始化:var mySlice []int
此时,mySlice
是一个nil切片,即它没有指向任何底层数组,长度和容量均为0。 - 使用
:=
自动推导类型声明切片:mySlice :=[]int{}
此时,mySlice
是一个空的整型切片,长度为0,但已经分配了底层数组(容量为0或系统默认值)。 - 使用
make
函数创建切片:mySlice :=make([]int,5)
通过make
函数可以创建一个指定长度的切片,并且可以选择性地指定容量。如果不指定容量,则容量等于长度。
二、切片的初始化与创建
**2.1 使用
make
函数创建切片**
make
函数是Go语言内置的函数,专门用于创建切片、map和channel等复合类型。使用
make
函数创建切片时,可以指定切片的长度和容量:
slice :=make([]int,5,10)// 创建一个长度为5,容量为10的整型切片
2.2 使用切片字面量创建切片
切片也可以像数组一样使用字面量进行初始化,但不需要指定数组的长度:
myStr :=[]string{"Jack","Mark","Nick"}// 创建并初始化一个字符串切片
myNum :=[]int{10,20,30,40}// 创建并初始化一个整型切片
2.3 基于数组创建切片
切片可以基于一个已存在的数组创建,切片可以只使用数组的一部分元素或者全部元素,甚至可以创建一个比数组更大的切片(只要不超过数组的容量)。
months :=[...]string{"January","February","March","April","May","June","July","August","September","October","November","December"}
q2 := months[3:6]// 基于数组创建切片,表示第二季度
三、切片的操作
3.1 访问切片元素
访问切片元素与访问数组元素类似,使用索引操作符
[]
。
mySlice :=[]int{1,2,3,4,5}
fmt.Println(mySlice[0])// 输出: 1
3.2 切片长度的动态变化
切片支持动态地增加或减少元素,这是切片与数组最大的不同。切片扩容通常通过内置的
append
函数实现。
mySlice :=[]int{1,2,3}
mySlice =append(mySlice,4,5)// 向切片末尾追加两个元素
fmt.Println(mySlice)// 输出: [1 2 3 4 5]
3.3 切片的扩容机制
当使用
append
函数向切片追加元素时,如果切片的容量不足以容纳新增的元素,Go语言会自动进行扩容。扩容时,新切片的容量通常是原容量的两倍(当原切片长度小于1024时)。如果扩容后的容量仍然不够,则继续按此规律扩容,直到能够容纳所有元素。
oldSlice :=[]int{1,2,3,4,5}
newSlice :=append(oldSlice,6,7,8,9)
fmt.Println("newSlice len:",len(newSlice),"cap:",cap(newSlice))// 输出可能会是: newSlice len: 9 cap: 10
3.4 切片的切片
切片也可以基于另一个切片创建,这被称为切片的切片。通过指定起始索引和结束索引(可选指定容量),可以从一个切片中创建新的切片。
firstHalf := months[:6]// 前半年
q1 := firstHalf[:3]// 第一季度
3.5 切片的复制
Go语言提供了
copy
函数,用于将一个切片复制到另一个切片中。如果两个切片的大小不同,则按照其中较小的那个切片的大小进行复制。
src :=[]int{1,2,3}
dst :=make([]int,2)copy(dst, src)// 将src的前两个元素复制到dst
fmt.Println(dst)// 输出: [1 2]
四、切片的遍历
切片的遍历方式与数组相同,支持使用索引遍历和
for range
遍历。
4.1 索引遍历
slice :=[]int{1,2,3,4,5}for i :=0; i <len(slice); i++{
fmt.Println(slice[i])}
**4.2
for range
遍历**
slice :=[]int{1,2,3,4,5}for index, value :=range slice {
fmt.Println(index, value)}
五、切片的应用案例
5.1 计算切片中整数的和
funcsum(numbers []int)int{
total :=0for_, number :=range numbers {
total += number
}return total
}funcmain(){
numbers :=[]int{1,2,3,4,5}
fmt.Println("Sum:",sum(numbers))// 输出: Sum: 15}
5.2 查找切片中的最大值
funcfindMax(numbers []int)int{
max := numbers[0]for_, number :=range numbers {if number > max {
max = number
}}return max
}funcmain(){
numbers :=[]int{3,5,2,8,1}
fmt.Println("Max:",findMax(numbers))// 输出: Max: 8}
5.3 切片作为函数参数
切片作为函数参数时,传递的是切片的引用,因此在函数内部对切片的修改会影响到原切片。
funcmodifySlice(s []int){
s[0]=100}funcmain(){
mySlice :=[]int{1,2,3}modifySlice(mySlice)
fmt.Println(mySlice)// 输出: [100 2 3]}
六、总结
切片是Go语言中一种非常强大且灵活的数据结构,它通过封装数组提供了动态调整大小的能力。切片的操作包括声明、初始化、访问元素、动态变化、遍历、复制等。切片作为函数参数时,传递的是切片的引用,因此对切片的修改会影响到原切片。通过本教程的学习,希望读者能够深入理解并掌握Go语言中切片的用法。
版权归原作者 景天科技苑 所有, 如有侵权,请联系我们删除。