15分钟学 Go 第 14 天:切片

news2024/10/22 11:01:20

第14天:切片

学习目标

在今天的课程中,我们将学习Go语言中的切片,重点是切片的定义、使用、动态数组的特性及其在实际编程中的应用。通过实例和流程图,帮助你深入理解切片的工作原理与最佳实践。

一、切片的概念

切片是Go语言中一种重要的数据结构,提供了比数组更灵活的操作方式。切片是对数组的封装,使得数组的长度可以动态变化。

特点

  • 动态大小:切片的长度可以在运行时改变。
  • 引用类型:切片是一种引用数据类型,对切片的修改会影响其底层数组。
  • 包含指针、长度和容量:切片包含了指向底层数组的指针、切片的长度和切片的容量(可以容纳的元素个数)。

二、切片的定义与初始化

切片可以通过以下方式定义和初始化:

2.1 使用 make() 函数

make() 用于创建切片并分配内存:

slice := make([]int, 5) // 创建一个长度为5的整型切片
2.2 使用字面量初始化

切片可以通过字面量来直接初始化:

slice := []string{"Apple", "Banana", "Cherry"}
2.3 从数组创建切片

可以从数组中提取一个切片:

arr := [5]int{1, 2, 3, 4, 5}
sliceFromArr := arr[1:4] // 得到切片 [2, 3, 4]

三、切片的属性

切片有三个主要属性:

  1. 长度(Length):切片当前包含的元素数量,可以用 len() 函数获取。
  2. 容量(Capacity):切片可以容纳的最大元素数量,使用 cap() 函数获取。
  3. 指针(Pointer):指向切片底层数组的首地址。

四、切片的使用

4.1 创建与访问切片

以下是一个创建和访问切片的示例代码:

package main

import (
    "fmt"
)

func main() {
    // 使用 make 创建长度为5的整数切片
    numbers := make([]int, 5)
    fmt.Println("初始切片:", numbers) // 输出 [0 0 0 0 0]
    
    // 访问并修改切片元素
    numbers[0] = 10
    numbers[1] = 20
    fmt.Println("修改后的切片:", numbers) // 输出 [10 20 0 0 0]
}
4.2 切片的扩展

切片可以通过内置的 append() 函数动态扩展:

numbers = append(numbers, 30) // 添加一个新元素
fmt.Println("添加元素后的切片:", numbers) // 输出 [10 20 0 0 0 30]

五、切片的遍历

切片的遍历和数组类似,可以使用 for 循环和 range 来实现:

5.1 使用传统的 for 循环
for i := 0; i < len(numbers); i++ {
    fmt.Printf("Index: %d, Value: %d\n", i, numbers[i])
}
5.2 使用 range 循环
for index, value := range numbers {
    fmt.Printf("Index: %d, Value: %d\n", index, value)
}

六、切片的长度和容量

切片的长度和容量可以通过 len()cap() 函数获取:

fmt.Println("切片的长度:", len(numbers)) // 输出切片当前的长度
fmt.Println("切片的容量:", cap(numbers))  // 输出切片底层数组的容量

七、切片的零值

切片的零值为 nil,表示未初始化的切片。可以通过检查切片是否为 nil 来判断切片是否已分配。

var s []int
if s == nil {
    fmt.Println("切片是 nil") // 输出 "切片是 nil"
}

八、切片的复制

切片可以使用 copy() 函数进行复制:

source := []int{1, 2, 3}
destination := make([]int, len(source))
copy(destination, source)
fmt.Println("源切片:", source)         // 输出 [1 2 3]
fmt.Println("目标切片:", destination) // 输出 [1 2 3]

九、切片的切片

切片可以从其他切片中创建新的切片:

subSlice := numbers[1:4] // 从 numbers 切割出新的切片
fmt.Println("子切片:", subSlice) // 输出 [20 0 0]

十、切片与数组的区别

特性数组切片
大小固定动态
类型数组类型切片类型
引用类型值类型引用类型
内存分配静态动态

十一、实际应用场景

切片在许多现实编程问题中非常有用,比如存储来自用户输入的数据、处理多个数据项等。

示例:处理用户输入的切片
package main

import (
    "fmt"
)

func main() {
    var names []string
    var input string

    fmt.Println("输入名字(输入'结束'以退出):")
    
    for {
        fmt.Scanln(&input)
        if input == "结束" {
            break
        }
        names = append(names, input)
    }

    fmt.Println("你输入的名字:", names)
}

十二、切片和内存

切片在动态扩展时,底层数组可能需要重新分配。Go会在运行时管理内存,当切片的容量不足时,会分配一个更大的底层数组,并将原有数据复制过去。这个过程可能会导致性能上升陡峭,因此在定义切片时可以提前设置适当的容量。

s := make([]int, 0, 10) // 指定初始容量为10
for i := 0; i < 15; i++ {
    s = append(s, i) // 会触发扩展
}

十三、常见问题解答

Q1: 切片的容量如何决定?

A: 切片的容量是由底层数组的大小决定的,初始时由 make() 指定,之后根据需要动态扩展。

Q2: 切片可以包含不同类型的元素吗?

A: 不可以,切片必须包含相同类型的元素。不同类型元素可以使用接口切片实现,但不推荐。

Q3: 增加切片元素时是否会影响性能?

A: 是的,当切片的容量不足时,重新分配底层数组和复制元素会造成性能开销,建议在初始化时根据预估大小设置切片的容量。

十四、流程图

下面是一个示例程序的运行流程图:

+--------------------+
|       main         |
+--------------------+
| Initialize slice   |
| Loop to read input |
| Append to slice    |
| Print final slice  |
+--------------------+

十五、总结

通过今天的学习,我们了解了切片的定义、使用方法及其在动态数组方面的灵活性。我们还讨论了切片的遍历、复制、切割及其在实际应用中的重要性。切片是Go语言中不可或缺的组成部分,掌握切片将帮助你在开发中更高效地管理数据。


怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

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

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

相关文章

深度学习面试笔试之前向神经网络-多层感知器、损失函数、反向传播

深度学习面试笔试之前向神经网络-多层感知器、损失函数、反向传播 1. 什么是神经网络1.1 什么是感知器1.2 神经网络的结构1.3 为什么神经网络具有非线性切分能力 2. 神经网络的计算过程2.1 计算过程2.2 随机初始化模型参数2.3 激活函数2.3.1 激活函数有哪些2.3.2 优缺点2.3.3 为…

32.第二阶段x86游戏实战2-遍历技能2(技能二叉树基址)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

爱快路由器配置腾讯云动态域名DDNS详细说明

直白点说就是让爱快路由器自动配置当前公网IP地址给域名&#xff0c;动态域名DDNS不清楚的请自行百度&#xff0c; 这里就可以看见操作日志&#xff0c;那么我们一步一步来配置它吧&#xff0c;首先登录爱快路由器&#xff0c;如下图&#xff1a; 那么腾讯云我们怎么找到ID和…

什么是乐观锁、悲观锁?

什么是乐观锁、悲观锁&#xff1f; 乐观锁&#xff1a;乐观锁和悲观锁是并发控制的两种方式&#xff0c;用来确保在多线程或多用户访问共享资源时&#xff0c;数据的一致性和完整性。 悲观锁&#xff08;Pessimistic Lock&#xff09; 悲观锁假设并发操作会经常发生&#xf…

内卷中的营销大斗法:破局与挑战

如今&#xff0c;各个行业内卷严重&#xff0c;企业在营销领域展开了激烈的大斗法。 内卷&#xff0c;是指一种社会或文化模式在发展到一定阶段后&#xff0c;无法实现自我突破&#xff0c;只能在内部不断精细化、复杂化。商业领域的内卷表现为企业间在产品、服务、价格等方面…

Unity通过高德开放平台获取天气信息

一、注册高德开放平台账号&#xff0c;获取天气接口Key 1、构建自己的应用 网址&#xff1a;https://lbs.amap.com/api/webservice/guide/api/weatherinfo 最终调用api的地址形式&#xff1a; https://restapi.amap.com/v3/weather/weatherInfo?city110101&key<用户…

比瓴科技入选国家工业信息安全发展研究中心SBOM工作组首批成员单位

近日&#xff0c;由开放原子开源基金会主办&#xff0c;开源风险评估与治理技术实验室承办的2024开放原子开源生态大会软件物料清单&#xff08;SBOM&#xff09;分论坛在北京成功举办。 在会议上&#xff0c;国家工业信息安全发展研究中心&#xff08;简称“中心”&#xff0…

Florence-2视觉语言模型简明教程

近年来&#xff0c;计算机视觉领域见证了基础模型的兴起&#xff0c;这些模型无需训练自定义模型即可进行图像注释。我们已经看到了用于分类的 CLIP [2]、用于对象检测的 GroundingDINO [3] 和用于分割的 SAM [4] 等模型——每个模型都在其领域表现出色。但是&#xff0c;如果我…

互动装置如何助力乡村振兴展厅板块划分,实现展示效果最大化?

在这片广袤的土地上&#xff0c;每一个乡村都承载着深厚的历史与文化&#xff0c;如今&#xff0c;随着乡村振兴战略的深入实施&#xff0c;为乡村注入了新的活力&#xff0c;乡村振兴展厅的建设&#xff0c;也成为了这一奋斗目标的有力见证和辅助工具&#xff0c;我们今天就来…

从传统到智能,从被动监控到主动预警,解锁视频安防平台EasyCVR视频监控智能化升级的关键密钥

视频监控技术从传统监控到智能化升级的过程是一个技术革新和应用场景拓展的过程。智能视频监控系统通过集成AI和机器学习算法&#xff0c;能够实现行为分析、人脸识别和异常事件检测等功能&#xff0c;提升了监控的准确性和响应速度。这些系统不仅用于传统的安全防护&#xff0…

英语语法学习框架(考研)

一、简单句 英语都是由简单句构成&#xff0c;简单句共有五种基本句型&#xff1a;①主谓&#xff1b;②主谓宾&#xff1b;③主谓宾宾补&#xff1b;④主谓宾间宾&#xff08;间接宾语&#xff09;&#xff1b;⑤主系表&#xff1b; 其中谓语是句子最重要的部分&#xff0c;谓…

渗透实战 JS文件怎么利用

1.前言 关于JS在渗透测试中的关键作用&#xff0c;想必不用过多强调&#xff0c;在互联网上也有许多从JS中找到敏感信息从而拿下关键系统的案例。大部分师傅喜欢使用findsomething之类的浏览器插件&#xff0c;也有使用诸如Unexpected.information以及APIFinder之类的Burp插件…

【Linux】【命令】diff

diff DescriptionsArgumentsExamples直接使用diff命令-u 输出格式-c 输出格式并列输出-s 和 -q 脚本示例示例1&#xff1a;目录及文件差异 Descriptions diff命令用于对比两个文件或者两个文件夹的不同之处&#xff0c;求基本语法如下所示&#xff1a; diff [OPTION]... FILES…

免费插件集-illustrator插件-Ai插件-创建外接圆

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现创建图形中的创建外接圆功能。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/…

Java消息摘要:SHA验证数据完整性、密码的加密

1、SHA 算法家族 SHA&#xff08;Secure Hash Algorithm&#xff0c;安全散列算法&#xff09;是一个密码散列函数家族&#xff0c;被美国国家安全局&#xff08;NSA&#xff09;设计&#xff0c;并由美国国家标准与技术研究院&#xff08;NIST&#xff09;发布为联邦数据处理…

无人机之自主飞行关键技术篇

无人机自主飞行指的是无人机利用先进的算法和传感器&#xff0c;实现自我导航、路径规划、环境感知和自动避障等能力。这种飞行模式大大提升了无人机的智能化水平和操作的自动化程度。 一、传感器技术 传感器是无人机实现自主飞行和数据采集的关键组件&#xff0c;主要包括&a…

sql server 行转列及列转行

图1 图2 1.行转列 &#xff08;图1->图2&#xff09; 1.方法一 (数据库通用&#xff09;&#xff0c;使用max 加case when 函数 -- 行转列 图1->图2 SELECT name,MAX(CASE WHEN subject语文 THEN score ELSE 0 END) AS "语文",MAX(CASE WHEN subject数学 …

OpenSEMBA :一个用于电磁场模拟的开源软件框架

OpenSEMBA 是一个用于电磁场模拟的开源软件框架&#xff0c;主要针对时域有限差分法&#xff08;FDTD&#xff09;和其他数值方法。以下是 OpenSEMBA 的主要特点、功能和应用领域的详细介绍&#xff1a; 主要特点 开源平台 &#xff1a; OpenSEMBA 是一个开源项目&#xff0…

2025全网最全计算机毕业设计选题推荐:计算机毕设选题指导及避坑指南√

博主介绍&#xff1a;✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…