【GO语言卵细胞级别教程】09.切片的超能力(含习题)

【GO语言卵细胞级别教程】09.切片的超能力(含习题)

目录

  • 【GO语言卵细胞级别教程】09.切片的超能力(含习题)
  • 1.概述
    • 1.1 简介
    • 1.2 为什么需要切片
  • 2.语法介绍
    • 2.1 切片的定义
    • 2.2切片基本使用
      • 2.2.1遍历
      • 2.2.2切片的骚操作
    • 2.3切片与数组
  • 3.敢不敢练一练

🥰微信公众号:【给点知识】分享小知识,快速成长,欢迎关注呀!(底部点击二维码)
🥰本项目演示代码仓库:https://gitee.com/gdzsfun/csdn-study-go 演示项目仓库
🥰本项目创建方式:【GO语言卵细胞级别教程】05.项目创建和函数讲解
🥰学习宗旨:活到老,学到老。
😍写作宗旨:致力于改变现有文章难读难懂问题。
今日分享诗句

在这里插入图片描述

   切片是Go语言中的一项强大功能,它不仅能够灵活地操作数据,还能让你的代码达到令人瞩目的性能。本文将揭示切片的神奇之处,以及如何利用它们在开发中获得无限可能。从切片的定义到高级应用,我们将深入探讨切片与数组的区别,并分享一些独家技巧和最佳实践。无论你是新手还是经验丰富的开发者,本文都将帮助你释放切片的威力,让你的代码瞬间提升到一个全新的水平!准备好迎接切片的变革了吗?

1.概述

1.1 简介

切片是go中的一种数据类型,类似python中的列表,也是Golang中的一种动态所长度的数组。切片是一种动态长度的数据结构,可以看作是对底层数组的引用,提供了灵活的操作方式。
切片的底层使用使用了数组,
切片上层使用一个结构体用来记录切片的长度、容量、用来指向底层数组首元素的指针
在这里插入图片描述

1.2 为什么需要切片

  1. 固定长度的数组限制:数组在创建时需要指定固定的长度,这限制了数组在处理动态数据集合时的灵活性。而切片允许动态增长和缩减长度,解决了数组固定长度的限制。
  2. 内存管理和传递效率:切片内部维护了一个指向底层数组的指针,多个切片可以共享同一个底层数组。这意味着切片的创建和操作不需要复制整个数据集合,减少了内存占用和时间开销。同时,切片作为引用类型,通过引用传递,避免了不必要的数据复制,提高了传递效率。
  3. 动态数据集合的处理:在许多应用场景中,数据集合的大小在运行时是不确定的,例如读取文件、处理网络请求等。切片的动态长度和灵活操作使其成为处理动态数据集合的理想选择,无需提前确定大小,可以随需增加或减少元素。
  4. 与标准库和第三方库的兼容性:切片是 Go 语言中广泛使用的数据结构,与标准库和许多第三方库具有良好的兼容性。标准库中的许多函数和方法接受和返回切片类型,使用切片可以更好地与标准库和其他库进行交互,提高代码的可重用性和互操作性。

2.语法介绍

在 Go 语言中,切片是一种动态数组类型,它提供了方便的操作和管理底层数组的能力。切片有两个相关的属性:长度(length)和容量(capacity)。

  1. 长度(Length):切片的长度表示当前切片中实际存储的元素个数。它可以通过内置函数 len() 来获取。例如,对于一个切片 s,可以通过 len(s) 获取其长度。切片的长度可以随着元素的增加或删除而动态变化。
  2. 容量(Capacity):切片的容量表示底层数组从切片的起始位置到底层数组末尾的元素个数。它可以通过内置函数 cap() 来获取。例如,对于一个切片 s,可以通过 cap(s) 获取其容量。切片的容量在创建时就确定,并且在不重新分配底层数组的情况下不会改变。

切片的长度和容量之间有以下关系:

  • 切片的长度不会超过其容量。即 len(s) <= cap(s)
  • 切片的长度表示当前实际存储的元素个数,容量表示切片能够容纳的最大元素个数。
  • 切片可以通过切片操作 s[a:b] 来截取部分元素,截取后的切片长度为 b - a,容量为底层数组末尾的元素个数。

当使用 make 函数创建切片时,可以指定切片的长度和容量。如果只指定长度而不指定容量,则切片的容量与长度相等。例如,slice := make([]int, 3, 5) 创建一个长度为 3、容量为 5 的切片。

注意:切片的长度和容量是动态变化的,当使用 append 函数向切片追加元素时,切片的长度会增加,当超过容量时,底层数组会自动扩容。因此,在使用切片时,要根据需要合理管理长度和容量,以避免不必要的内存分配和复制。

2.1 切片的定义

切片与数组较为相似,所以这里使用与数组对比的方式来学习

  1. 定义一个空的切片,和数组定义差不多,只不过不带长度
    var slice1 []int

    slice1 := []int
package mystudy
// 切片知识总结
import "fmt"func DemoSlice2(){fmt.Println("------切片基本知识------")// 1.切片的定义//(1)空切片fmt.Println("------1定义一个空切片------")var slice1 []intfmt.Println(slice1)
}
// 输出结果
------切片基本知识------
------1定义一个空切片------
[]
  1. 定义一个初始默认值的切片
    slice2 := []int{1,2,33,44,55}
package mystudy
// 切片知识总结
import "fmt"func DemoSlice2(){fmt.Println("------切片基本知识------")//(2)定义一个初始值的切片fmt.Println("------2.定义一个初始值的切片------")slice2 := []int{1,2,33,44,55}fmt.Println(slice2)
}
  1. 由数组转为切片
package mystudy
// 切片知识总结
import "fmt"func DemoSlice2(){fmt.Println("------切片基本知识------")//(3)由数组转为切片var array1 [10]int = [10]int{1, 2, 3, 5}slice3 := array1[:3]fmt.Printf("%T, %v", slice3, slice3)fmt.Println()
}
  1. 使用make关键字实现
    (1)使用make申请空间,make有三个参数 类型、长度、容量
    这个长度就是切片的元素个数,容量就是这个切片申请的空间
    容量必须要大于等于长度
    容量会动态更新大小
package mystudy
// 切片知识总结
import "fmt"func DemoSlice2(){fmt.Println("------切片基本知识------")//(4)使用make申请空间 make(类型,长度,容量)slice4 := make([]int, 5, 6)fmt.Println("使用mak创建时的初始值slice4:",slice4)fmt.Printf("长度%v, 容量%v\n",len(slice4), cap(slice4))slice4 = []int{1,2,3}fmt.Printf("type:%T, value:%v\n", slice4, slice4)fmt.Printf("长度%v, 容量%v\n",len(slice4), cap(slice4))
}

2.2切片基本使用

2.2.1遍历

  1. 使用for
slice4 := make([]int, 5, 6)
slice4 = []int{1,2,3}for i:=0;i<len(slice4);i++{fmt.Println(slice4[i])
}
  1. 使用for-range
slice4 := make([]int, 5, 6)
slice4 = []int{1,2,3}for i,v := range slice4{fmt.Println(i,v)
}

2.2.2切片的骚操作

  1. 切片赋值:使用下标赋值,只能赋值长度范围内的,否侧报错panic: runtime error: index out of range [4] with length 3
// 使用下标赋值,只能赋值长度范围内的
slice4 := []int{1,2,3}
slice4[1]= 1
  1. 使用方法append()增加元素:
    (1)创建一个新的数组
    (2)把老数组赋值给新数组
    (3)新数组,增加新的值,然后再把数组付给新的变量引用
slice4 := make([]int, 5, 6)
slice4 = []int{1,2,3}
slice4[2] = 12
slice4 = append(slice4, 88,99,100, 101)
fmt.Println(slice4)
fmt.Printf("长度%v, 容量%v\n",len(slice4), cap(slice4))
// 输出结果
[1 2 12 88 99 100 101]
长度7, 容量8
  1. 使用=号赋值给新的变量:其实是引用,而不是真正的赋值,
slice1 := []int{1,2}
slice2 = slice1
slice2[1]=99
fmt.Println(slice1, slice2)
// 结果
[1 99] [1 99]
  1. 如何解决=号赋值时引用的问题,使用copy
slice5 := []int{1,2,3}
var slice6 = make([]int, 2)
copy(slice6, slice5)
fmt.Println(slice6, slice5)
slice6[1]=99
fmt.Println(slice6, slice5)
// 输出结果
[1 2] [1 2 3]
[1 99] [1 2 3]
  1. 一个切片使用append扩展另一个切片
slice7 := []int{7, 77}
slice8 := []int{8, 88}
slice7 = append(slice7, slice8...)
fmt.Println(slice7)
// [7 77 8 88]

2.3切片与数组

  1. 定义方式
数组定义 var shuzu1 [10]int
切片定义 var qiepian []int 
  1. 遍历方式: 相同都是通过for for-range
  2. 取值方式:相同都是通过下标取值
  3. 索引问题
    (1)切片如果越界了,编译阶段不会报错,运行时报错
    (2)数组越界编译阶段会直接报错
  4. 获取长度和容量
数组和切片都可以通过len获取长度 cap获取容量,只不过,数组的容量和长度相同
slice7 := []int{7, 77}
slice8 := []int{8, 88}
slice7 = append(slice7, slice8...)
fmt.Println(slice7)
var shuzu = [10]int{1,2,}
fmt.Printf("数组长度%v, 数组容量%v\n",len(shuzu), cap(shuzu))
fmt.Printf("切片长度%v, 切片容量%v\n",len(slice7), cap(slice7))
// 输出结果
[7 77 8 88]
数组长度10, 数组容量10
切片长度4, 切片容量4
  1. 赋值
都可以通过下标赋值
aaa[1]=1
  1. =号复制
    比如有切片a=b 数组a=b
    (1)数组复制是真的申请了新的空间复制 a与b是不同的,互不影响,切片是引用,a变b也变
数组复制,必须要求两个数组长度一样、类型一样
var shuzu = [10]int{1,2,}
var shuzu2 [10]int
shuzu2 = shuzu
fmt.Println(shuzu2)切片复制 申请一个就可以复制
var slice9  = make([]int, 2)
slice9 = slice7
fmt.Println(slice9)

(2)数组可以赋值给切片,切片无法赋值给数组

数组赋值给切片
slice9 = shuzu2[:]

3.敢不敢练一练

选择题和算法题,并附有答案供参考:

选择题:

  1. 下列哪个选项描述了切片的特性?
    a) 固定长度
    b) 可变长度
    c) 只能存储整数类型
    d) 只能存储字符串类型

    答案:b) 可变长度

  2. 切片的长度和容量之间的关系是:
    a) 长度永远小于容量
    b) 长度永远大于容量
    c) 长度可能小于、等于容量
    d) 长度和容量没有直接关系

    答案:c) 长度可能小于、等于容量

算法题:

  1. 给定一个整数切片 nums,编写一个函数 removeDuplicates,将切片中重复的元素去除,返回去重后的切片长度。要求在原地修改切片,不使用额外的空间。
    示例输入:[1, 1, 2, 2, 3, 4, 4, 5]
    示例输出:5
    示例切片变为:[1, 2, 3, 4, 5]

    答案:

    func removeDuplicates(nums []int) int {if len(nums) == 0 {return 0}index := 0for i := 1; i < len(nums); i++ {if nums[i] != nums[index] {index++nums[index] = nums[i]}}return index + 1
    }
    
  2. 给定一个整数切片 nums 和一个目标值 target,编写一个函数 twoSum,找到切片中两个数的索引,使得它们的和等于目标值。假设切片中一定存在这样的两个数,并且每个数只能使用一次。
    示例输入:[2, 7, 11, 15],目标值 target = 9
    示例输出:[0, 1]

    答案:

    func twoSum(nums []int, target int) []int {numMap := make(map[int]int)for i, num := range nums {complement := target - numif j, ok := numMap[complement]; ok {return []int{j, i}}numMap[num] = i}return nil
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1958 上学路线

难度&#xff1a;普及- 题目描述 你所在城市的街道好像一个棋盘&#xff0c;有 a 条南北方向的街道和 b 条东西方向的街道。南北方向的 a 条街道从西到东依次编号为 1 到 a&#xff0c;而东西方向的 b 条街道从南到北依次编号为 1 到 b&#xff0c;南北方向的街道 i 和东西方…

基于springboot的家庭装修报价系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SpringBoot框架 3 1.2 ECharts 3 1.3 Vue框架 3 1.4 Bootstrap框架 3 1.5 JQuery技术 4 1.6 Ajax技术 4 1.7 本章小结 4 2 系统分析 5 2.1 需求分析 5 2.2 非功能需求 7 2.3 本章小结 8 3 系统设计 9 3.1 系统总体设计 9 …

通过Step Back提示增强LLM的推理能力

原文地址&#xff1a;enhancing-llms-reasoning-with-step-back-prompting 论文地址&#xff1a;https://arxiv.org/pdf/2310.06117.pdf 2023 年 11 月 6 日 Introduction 在大型语言模型不断发展的领域中&#xff0c;一个持续的挑战是它们处理复杂任务的能力&#xff0c;这…

数字化转型导师坚鹏:科技金融政策、案例及发展研究

科技金融政策、案例及发展研究 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚科技金融有哪些利好政策&#xff1f; 不知道科技金融有哪些成功案例&#xff1f; 不知道科技金融未来发展方向&#xff1f; 课程特色&#xff1a; 以案例的方式解读原创方…

多模态响应与功能集成!华中科技大学微型磁控胶囊机器人登上《Nature Communications》!

胶囊机器人可以通过口服方式抵达胃肠道病灶区域实施医疗功能&#xff0c;为实现胃肠道疾病无痛无创诊疗和提高患者依从性提供了重要途径。其中&#xff0c;磁控胶囊机器人技术因其驱动方式具有非接触、穿透性能好和控制模式丰富等优势而被认为是最理想的胃肠道疾病诊疗手段之一…

ai学习前瞻-python环境搭建

python环境搭建 Python环境搭建1. python的安装环境2. MiniConda安装3. pycharm安装4. Jupyter 工具安装5. conda搭建虚拟环境6. 安装python模块pip安装conda安装 7. 关联虚拟环境运行项目 Python环境搭建 1. python的安装环境 ​ python环境安装有4中方式。 从上图可以了解…

汽车级瞬态抑制TVS二极管优势特性及型号大全

汽车级瞬态抑制TVS二极管是一种高性能的防浪涌过电压电路保护元器件&#xff0c;能够在瞬态电压过高的情况下提供可靠的保护。它能够迅速响应并吸收过电压&#xff0c;将其导向地线&#xff0c;从而保护车辆的电子设备免受损坏。东沃汽车级TVS二极管具有以下几个关键优势&#…

118.龙芯2k1000-pmon(17)-制作ramdisk

目前手上这个设备装系统不容易&#xff0c;总是需要借助虚拟机才能实现。 对生产就不太那么友好&#xff0c;能否不用虚拟机就能装Linux系统呢&#xff1f; 主要是文件系统的问题需要解决&#xff0c;平时我们一般是用nfs挂载后&#xff0c;然后对硬盘格式化&#xff0c;之后…

c++版本回文质数 Prime Palindromes 题解(洛谷)

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

人才推荐 | 毕业于美国凯斯西储大学的博士,专业知识广泛

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

目标检测——监控下打架检测数据集

一、简述 首先&#xff0c;监控下打架检测是维护公共安全的重要手段。在公共场所、学校、监狱等地方&#xff0c;打架事件往往难以避免。通过安装打架检测监控系统&#xff0c;可以实时监控并准确识别打架事件&#xff0c;及时采取必要的应对措施&#xff0c;有效地减少打架事…

[数据集][目标检测]变电站缺陷检测数据集VOC+YOLO格式8307张17类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8307 标注数量(xml文件个数)&#xff1a;8307 标注数量(txt文件个数)&#xff1a;8307 标注…