【Go】Go语言切片(Slice)深度剖析与应用实战

news2024/11/16 13:26:49

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Go语言切片(Slice)详细用法教程
    • 一、切片的定义与内部结构
    • 二、切片的初始化与创建
    • 三、切片的操作
    • 四、切片的遍历
    • 五、切片的应用案例
    • 六、总结

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 计算切片中整数的和

func sum(numbers []int) int {
    total := 0
    for _, number := range numbers {
        total += number
    }
    return total
}

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    fmt.Println("Sum:", sum(numbers)) // 输出: Sum: 15
}

5.2 查找切片中的最大值

func findMax(numbers []int) int {
    max := numbers[0]
    for _, number := range numbers {
        if number > max {
            max = number
        }
    }
    return max
}

func main() {
    numbers := []int{3, 5, 2, 8, 1}
    fmt.Println("Max:", findMax(numbers)) // 输出: Max: 8
}

5.3 切片作为函数参数

切片作为函数参数时,传递的是切片的引用,因此在函数内部对切片的修改会影响到原切片。

func modifySlice(s []int) {
    s[0] = 100
}

func main() {
    mySlice := []int{1, 2, 3}
    modifySlice(mySlice)
    fmt.Println(mySlice) // 输出: [100 2 3]
}

六、总结

切片是Go语言中一种非常强大且灵活的数据结构,它通过封装数组提供了动态调整大小的能力。切片的操作包括声明、初始化、访问元素、动态变化、遍历、复制等。切片作为函数参数时,传递的是切片的引用,因此对切片的修改会影响到原切片。通过本教程的学习,希望读者能够深入理解并掌握Go语言中切片的用法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知乎:从零开始做自动驾驶定位; 注释详解(二)

这个个系统整体分为: 数据预处理 前端里程计 后端优化 回环检测 显示模块。首先来看一下数据预处理节点做的所有事情&#xff1a; 数据预处理节点 根据知乎文章以及代码我们知道: 节点功能输入输出数据预处理1.接收各传感器信息2.传感器数据时间同步 3.点云运动畸变补偿 4.传…

免杀对抗—python混淆算法反序列化shellcode

一、前言 内网已经学的七七八八了(主要是实验环境太麻烦了&#xff0c;累了)&#xff0c;今天就开启新的篇章——免杀。免杀我们主要是对生成的shellcode做免杀&#xff0c;而不是对生成的exe做免杀。为啥呢&#xff0c;你可以这样理解&#xff0c;exe已经是成品了&#xff0c…

Vue 内存泄漏分析:如何避免开发过程中导致的内存泄漏问题

一. 引言 Vue 作为一款流行的前端框架&#xff0c;已经在许多项目中得到广泛应用。然而&#xff0c;随着我们在 Vue 中构建更大规模的应用程序&#xff0c;我们可能会遇到一个严重的问题&#xff0c;那就是内存泄漏。内存泄漏是指应用程序在使用内存资源时未正确释放&#xff…

昇思MindSpore进阶教程-模型模块自定义

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 基础用法示例 神经网络模型由各种层(Lay…

【AI实战攻略】保姆级教程:用AI打造治愈动画vlog,轻松打造爆款,快速涨粉!

在当今这个快节奏的社会中&#xff0c;你是否也曾在某个雨夜&#xff0c;沉浸于那些温馨而治愈的动画短视频中&#xff0c;找到片刻的宁静与放松&#xff1f; 窗外大雨滂沱&#xff0c;而你&#xff0c;刚结束一天的忙碌&#xff0c;沐浴在温暖的热水中&#xff0c;随后裹上柔…

Integer 源码记录

Integer 公共方法结构 注意&#xff1a; 通过构造函数创建一个Integer对象&#xff0c;每次都会返回一个新的对象&#xff0c;如果使用 进行对象的比较&#xff0c;那么结果是false。 public Integer(int value) {this.value value;}与之对应的是&#xff0c;valueOf 方法…

java -----泛型

泛型的理解和好处 泛型是在JDK5之后引入的一个新特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式为 <数据类型> import java.util.ArrayList;SuppressWarnings({"all"}) public class Generic02 {public static void…

WGS1984快速度确定平面坐标系UTM分带(快速套表、公式计算、软件范围判定)

之前我们介绍了坐标系3带6带快速确定带号及中央经线&#xff08;快速套表、公式计算、软件范围判定&#xff09;就&#xff0c;讲的是CGCS2000 高斯克吕格的投影坐标系。 那还有我们经常用的WGS1984的平面坐标系一般用什么投影呢? 对于全球全国的比如在线地图使用&#xff1a…

探索GraphRAG:用yfiles-jupyter-graphs将知识库可视化!

yfiles-jupyter-graphs 可视化 GraphRAG 结构 前言 前面我们通过 GraphRag 命令生成了知识库文件 parquet&#xff0c;这节我们看一下如何使用 yfiles-jupyter-graphs 添加 parquet 文件的交互式图形可视化以及如何可视化 graphrag 查询的结果。 yfiles-jupyter-graphs 是一…

前端-js例子:收钱转账

支付宝转账 在这里用到周期定时器setInterval(function,time)&#xff0c;设置达到目标钱数时停止定时器。 点击转账按钮时&#xff0c;开始函数显示。 同时要确定输入框里输入的是数字。&#xff08;有一定容错&#xff09; window.onloadfunction(){var btn document.que…

vue3 + ts + pnpm:nprogress / 页面顶部进度条

一、简介 nprogress 是一个轻量级的进度条库&#xff0c;它适用于在网页上添加顶部进度条&#xff0c;用于指示页面加载进度或任何长时间的运行过程。这个库非常流行&#xff0c;因为它易于使用且视觉效果很好。 二、安装 pnpm add nprogress 三、在使用的页面引入 / src/v…

MySQL连接查询解析与性能优化成本

文章目录 一、连接查询1.连接查询基础1. INNER JOIN内连接2. LEFT JOIN (或 LEFT OUTER JOIN)左外连接3. RIGHT JOIN (或 RIGHT OUTER JOIN)右外连接4. FULL OUTER JOIN 2.连接查询的两种过滤条件3.连接的原理 二、性能优化成本1.基于成本的优化2.调节成本常数(1)mysql.server_…

ECharts基础使用方法 ---vue

1.安装依赖文件 仔细看项目" README.md " 描述&#xff0c;确定用什么安装 npm npm install echarts --save //官网推荐使用 pnpm pnpm install echarts --save 其他也是 在项目根目录&#xff0c;打开当前目录命令控制栏&#xff0c;输入以上命令并运行 安装成功后…

动动手指探索世界,旅游APP如何定制开发?

旅游APP的出现为旅行带来了许多便利。随着移动互联网的发展&#xff0c;旅游行业也在不断寻求创新与变革。旅游APP为游客提供了更加便捷的旅行体验&#xff0c;通过旅游APP&#xff0c;用户可以了解旅游信息、旅游服务、在线咨询等&#xff0c;实现在线一站式解决旅行需求的目标…

Github 2024-09-23 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-09-23统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6C++项目3C项目3HTML项目2PowerShell项目1TypeScript项目1JavaScript项目1Blade项目1PHP项目1Bootstrap 5: Web上开发响应式、移动优…

【文心智能体】 旅游手绘手帐 开发分享 零代码 手绘风景 记录行程和心情 旅游攻略

旅游手绘手帐&#xff0c;点击文心智能体平台AgentBuilder | 想象即现实 (baidu.com) 目录 背景 创作灵感 开发历程 一、基础配置 二、高级配置 三、引导示例&#xff08;提示词&#xff09; 期待优化 背景 这个智能体是一个零代码智能体&#xff08;文心智能体平台现…

MySQL篇(管理工具)

目录 一、系统数据库 二、常用工具 1. mysql 2. mysqladmin 3. mysqlbinlog 4. mysqlshow 5. mysqldump 6. mysqlimport/source 6.1 mysqlimport 6.2 source 一、系统数据库 MySQL数据库安装完成后&#xff0c;自带了一下四个数据库&#xff0c;具体作用如下&#xf…

JDBC和一下重要的jar包,分层结构

系列文章目录 JDBC和方便使用的jar包 目录 系列文章目录 文章目录 一、JDBC 1.步骤 2.SQL注入 3.SQL注入解决&#xff08;PreparedStatement&#xff09; 4.批处理和事务控制 5.连接池 Druid连接池&#xff08;德鲁伊&#xff09; 6.封装为工具类 7.ThreadLocal 、小秘书 二、…

大语言模型(LLM)入门学习路线图

Github项目上有一个大语言模型学习路线笔记&#xff0c;它全面涵盖了大语言模型的所需的基础知识学习&#xff0c;LLM前沿算法和架构&#xff0c;以及如何将大语言模型进行工程化实践。这份资料是初学者或有一定基础的开发/算法人员入门活深入大型语言模型学习的优秀参考。这份…

【FPGA】FPGA芯片结构

目录 1 可编程输出/输出单元&#xff08;IOB&#xff09;2 可配置逻辑块&#xff08;CLB&#xff09;3 数字时钟管理模块&#xff08;DCM&#xff09;4 嵌入式块存储器&#xff08;BRAM&#xff09;5 布线资源6 内嵌功能模块&#xff08;专用IP单元&#xff09;6.1 PLL&#xf…