6 Go的切片

概述

        在上一节的内容中,我们介绍了Go的数组,包括:声明数组、初始化数组、访问数组元素等。在本节中,我们将介绍Go的切片。在Go语言中,数组的长度是固定的,不能改变,这在某些场景下使用不太方便。切片(slice)是一种动态数组,它提供了更为灵活和便捷的方式来操作数组。切片是对数组的抽象,它包含了指向数组元素的指针、切片的长度和容量。

声明切片

        切片的声明使用[]操作符,语法如下:

          var sliceName []Type

        其中,sliceName表示切片的名称,Type表示切片中元素的类型。与数组不同,声明切片时,不需要指定长度。

        在下面的示例代码中,我们声明了一个名为numbers的整数类型切片,并初始为空切片。

var numbers []int

初始化切片

        可以使用数组来初始化切片,语法如下:

          var sliceName []Type = []Type{value1, value2, ..., valueN}

        其中,Type表示切片中元素的类型,value1、value2、...、valueN是切片中元素的初始值。

        在下面的示例代码中,我们创建了一个包含3个整数的切片,其初始值为1、2、3。还创建了一个包含2个字符串的切片,其初始值为“Hello”、“CSDN”。

package mainimport "fmt"func main() {var numbers []int = []int{1, 2, 3}text := []string{"Hello", "CSDN"}// 输出:[1 2 3]fmt.Println(numbers)// 输出:[Hello CSDN]fmt.Println(text)
}

        我们还可以使用内置函数make()来初始化切片,传入类型、数量、容量(可忽略)即可,元素的初始值为类型的默认值。

package mainimport "fmt"func main() {var numbers []int = make([]int, 3)text := make([]string, 2)// 输出:[0 0 0]fmt.Println(numbers)// 输出:[ ]fmt.Println(text)
}

        与数组相比,切片的长度是不固定的,可以追加元素。在追加时,可能使切片的容量增大。切片的长度可以由 len()函数获取,容量可以由cap()函数获取。

package mainimport "fmt"func main() {var numbers []int = make([]int, 3, 10)// 输出:3 10fmt.Println(len(numbers), cap(numbers))
}

        如果切片声明后,没有初始化,则为空切片。空切片默认为nil,其长度和容量均为0。

package mainimport "fmt"func main() {var numbers []int// 输出:0 0fmt.Println(len(numbers), cap(numbers))if numbers == nil {// 输出:[]fmt.Println(numbers)}
}

切片的切割

        在Go语言中,可以使用切片的切片操作来切割切片。切片的切片操作可以用来获取切片的一部分,或者将一个切片分割成多个子切片。切片的切片操作使用两个索引来指定切割的位置:第一个索引指定切割的起始位置,第二个索引指定切割的结束位置,但不包括该位置的元素。第一个索引不指定时,默认为0。第二个索引不指定时,默认为切片的长度。

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

切片的添加

        可以使用append()函数向切片添加一个或多个元素。append()函数会根据切片的容量和长度,自动调整底层数组的大小,并将新元素添加到切片的末尾。注意:append()函数会返回一个新的切片,包含添加元素后的结果;因此,需要将返回的结果重新赋值给原切片,以更新切片的内容。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3}// 添加元素99和100到切片的末尾numbers = append(numbers, 99, 100)// 输出:[1 2 3 99 100]fmt.Println(numbers)
}

        当向一个切片添加另一个切片的所有元素时,使用append()函数需要对第二个切片进行解包(切片后面添加符号...,用于展开切片中的元素),可参考下面的示例代码。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3}numbers2 := []int{99, 100}// 添加另一个切片,需要解包numbers = append(numbers, numbers2...)// 输出:[1 2 3 99 100]fmt.Println(numbers)
}

切片的删除

        切片的删除分为几种情况:从头部删除、从中间删除、从尾部删除。

        删除开头的元素时,可以直接移动数据指针。假如有一个切片slice,则slice[1:]会删除开头1个元素,slice[N:]会删除开头N个元素。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}// 删除开头2个元素numbers = numbers[2:]// 输出:[3 4 5]fmt.Println(numbers)
}

        也可以不移动数据指针,但将后面的数据向开头移动,此时可用append()函数原地完成。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}// 删除开头2个元素numbers = append(numbers[:0], numbers[2:]...)// 输出:[3 4 5]fmt.Println(numbers)
}

        删除中间的元素时,需要对剩余元素进行一次整体移动,此时仍可用append()函数原地完成。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5, 6}// 删除中间的3、4两个元素numbers = append(numbers[:2], numbers[4:]...)// 输出:[1 2 5 6]fmt.Println(numbers)
}

        删除尾部的元素时,直接切割即可。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5, 6}// 删除尾部的两个元素numbers = numbers[:len(numbers) - 2]// 输出:[1 2 3 4]fmt.Println(numbers)
}

切片的复制

        可以使用copy()函数来复制切片,它接受两个参数:第一个参数是目标切片,第二个参数是源切片。copy()函数会将源切片中的元素复制到目标切片中,并返回实际复制的元素个数。注意:如果源切片和目标切片不一样大,则会按照其中较小的那个切片的元素个数进行复制。另外,切片的复制不是在末尾添加元素,而是从开头位置覆盖之前已经存在的元素。

package mainimport "fmt"func main() {slice1 := []int{1, 2, 3, 4, 5}slice2 := []int{66, 88, 99}// slice2的容量小,故只会复制slice1的前3个元素到slice2中copy(slice2, slice1)// 输出:[1 2 3]fmt.Println(slice2)slice2 = []int{66, 88, 99}copy(slice1, slice2)// 输出:[66 88 99 4 5]fmt.Println(slice1)
}

切片的遍历

        有两种方法来实现切片的遍历:一是使用for循环,二是使用range关键字。

        在下面的示例代码中,我们使用了一个for循环,从切片的索引0开始遍历到切片的长度减1。通过索引,我们可以访问切片中的每个元素,并打印出来。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}for i := 0; i < len(numbers); i++ {fmt.Println(numbers[i])}
}

        在下面的示例代码中,我们使用了range关键字来遍历切片。每次迭代时,range会返回当前元素的索引和值。我们可以使用它们来访问切片中的元素,这种方法更加简洁和易读。

package mainimport "fmt"func main() {numbers := []int{1, 2, 3, 4, 5}for index, value := range numbers {fmt.Println(index, value)}
}

多维切片

        多维切片是由一系列切片组成的,每个切片可以具有不同的长度和容量。要创建一个多维切片,首先需要创建一个初始切片。然后使用该切片来创建额外的切片,每个新切片都会将原始切片的元素拆分为更小的切片。

        声明一个多维切片的语法格式如下:

          var sliceName [][]...[]Type

        其中,sliceName表示切片的名称,Type表示切片的类型,每个[]代表着一个维度,切片有几个维度就需要几个[]。

        在下面的示例代码中,我们首先创建了一个初始切片slice,长度为3。然后,我们使用range循环为每个内部切片创建了长度为2的子切片。接下来,我们给多维切片中的元素进行了赋值。最后,我们使用嵌套的range循环打印了多维切片的内容。

package mainimport "fmt"func main() {// 创建一个初始切片,长度为3slice := make([][]int, 3)for i := range slice {// 每个内部切片长度为2slice[i] = make([]int, 2)}// 给多维切片中的元素赋值slice[0][0] = 50slice[0][1] = 60slice[1][0] = 70slice[1][1] = 80slice[2][0] = 90slice[2][1] = 100// 打印多维切片的内容for i := range slice {for j := range slice[i] {fmt.Println(slice[i][j])}}
}

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

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

相关文章

【C++】一文简练总结【多态】及其底层原理&具体应用(21)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.多态的概念二.多态的实现1&#xff…

【C++】:拷贝构造函数与赋值运算符重载的实例应用之日期类的实现

C实现日期类 ├─属性&#xff1a; │ ├─年份 │ ├─月份 │ └─日期 ├─方法&#xff1a; │ ├─构造函数 │ ├─拷贝构造函数 │ ├─析构函数 │ ├─设置年份 │ ├─设置月份 │ ├─设置日期 │ ├─获取年份 │ ├─获取月份 │ ├─获取日期 │ ├…

websocket和mqtt

WebSocket是一种通信协议&#xff0c;它允许在浏览器和服务器之间建立持久连接&#xff0c;并允许双向传递数据。MQTT则是一种轻量级的发布/订阅消息传输协议&#xff0c;常用于物联网(IoT)设备之间的通信。 &#xff08;1&#xff09;js能直接实现mqtt吗&#xff0c;还是需…

已解决java.lang.IllegalStateException: Duplicate key

已解决java.lang.IllegalStateException: Duplicate key 文章目录 报错问题解决思路解决方法交流 报错问题 java.lang.IllegalStateException: Duplicate key 解决思路 java.lang.IllegalStateException: Duplicate key 是由于在使用 Map 或 Set 时&#xff0c;试图将一个已经…

十、sdl显示yuv图片

前言 SDL中内置加载BMP的API&#xff0c;使用起来会更加简单&#xff0c;便于初学者学习使用SDL 如果需要加载JPG、PNG等其他格式的图片&#xff0c;可以使用第三方库&#xff1a;SDL_image 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12sdl2.0.22&…

redis的性能管理和雪崩

redis的性能管理 redis的数据是缓存在内存当中的 系统巡检&#xff1a; 硬件巡检、数据库、nginx、redis、docker、k8s 运维人员必须要关注的redis指标 在日常巡检中需要经常查看这些指标使用情况 info memory #查看redis使用内存的指标 used_memory:11285512 #数据占用的…

最简单的简历练习

代码&#xff1a; <!DOCTYPE html> <html> <head> <title>我的简历</title> <style> body { background-image: url(https://picsum.photos/id/1018/1000/1000); background-size: cover; …

已解决java.lang.RuntimeException: java.io.IOException: invalid constant type: 18异常的正确解决方法,亲测有效!!!

已解决java.lang.RuntimeException: java.io.IOException: invalid constant type: 18异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录 报错问题解决方法交流 报错问题 java.lang.RuntimeException: java.io.IOException: invalid cons…

完美解决ERROR: Command errored out with exit status 1: command: ‘f:\program files\python\python36\pyt

完美解决ERROR: Command errored out with exit status 1: command: f:\program files\python\python36\pyt 下滑查看解决方法 文章目录 报错问题解决思路解决方法交流 报错问题 ERROR: Command errored out with exit status 1: command: ‘f:\program files\python\python3…

【华为OD】C卷真题 100%通过:攀登者1 C/C++源码实现

【华为OD】C卷真题 100%通过&#xff1a;攀登者1 C/C源码实现 目录 题目描述&#xff1a; 示例1 代码实现&#xff1a; 题目描述&#xff1a; 攀登者喜欢寻找各种地图&#xff0c;并且尝试攀登到最高的山峰。 地图表示为一维数组&#xff0c;数组的索引代表水平位置&…

C++二分查找算法:有序矩阵中的第 k 个最小数组和

本文涉及的基础知识点 二分查找算法合集 本题的简化 C二分查找算法&#xff1a;查找和最小的 K 对数字 十分接近m恒等于2 题目 给你一个 m * n 的矩阵 mat&#xff0c;以及一个整数 k &#xff0c;矩阵中的每一行都以非递减的顺序排列。 你可以从每一行中选出 1 个元素形成…

哈希unordered_set,unordered_map的练习

349. 两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输…

JSP过滤器和监听器

什么是过滤器 Servlet过滤器与Servlet十分相似&#xff0c;但它具有拦截客户端&#xff08;浏览器&#xff09;请求的功能&#xff0c;Servlet过滤器可以改变请求中的内容&#xff0c;来满足实际开发中的需要。 对于程序开发人员而言&#xff0c;过滤器实质就是在Web应用服务器…

使用Wireshark提取流量中图片方法

0.前言 记得一次CTF当中有一题是给了一个pcapng格式的流量包&#xff0c;flag好像在某个响应中的图片里。比较简单&#xff0c;后来也遇到过类似的情况&#xff0c;所以总结和记录一下使用Wireshark提取图片的方法。 提取的前提是HTTP协议&#xff0c;至于HTTPS的协议需要导入服…

【算法】摩尔投票算法

目录 1.概述2.算法思想3.代码实现3.1.t ⌊n / 2⌋3.2.t ⌊n / 3⌋3.3.t ⌊n / (m 1)⌋ 4.应用 参考&#xff1a;LeetCode_多数元素 II 题解 1.概述 &#xff08;1&#xff09;摩尔投票法 (Boyer–Moore Majority Vote Algorithm) 是一种用来寻找一组元素中多数元素的常量级…

flutter,uni-app开发调试ios

一、申请ios开发者账号 二、ios开发者配置 ios 开发者需要配置的地方 https://developer.apple.com/account/resources/certificates/list Certificates&#xff08;证书&#xff09;: 作用&#xff1a; 证书用于对应用程序和开发者进行身份验证&#xff0c;确保安全性和可…

如何为您的企业选择合适的多因素认证?

在传统的网络安全架构中&#xff0c;重点在于防止非法入侵&#xff0c;例如防火墙、VPN 、堡垒机等安全设备的重心都在于防止用户违规访问企业资源&#xff0c;一旦合法用户的账号密码被入侵者拿到&#xff0c;就可以冒充合法用户访问企业资源&#xff0c;所有的安全设备形同虚…

springcloud超市管理系统源码

技术说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui mysql 功能介绍&#xff1a; 后台管理&#xff1a; 统计分析&#xff1a;查看用户&#xff0c;商品&#xff0c;销售数量&#xff1b;…

Mock 数据

1. Mock 数据的方式 2. json-server 实现 Mock 数据 项目中安装json-server npm i -D json-server准备一个json文件添加启动命令 //package.json"scripts": {"start": "craco start","build": "craco build","test&q…

简单聊聊加密和加签的关系与区别

大家好&#xff0c;我是G探险者。 平时我们在项目上一定都听过加密和加签&#xff0c;加密可能都好理解&#xff0c;知道它是保障的数据的机密性&#xff0c;那加签是为了保障啥勒&#xff1f;它和加密有啥区别&#xff1f; 带着这个疑问&#xff0c;我们就来聊聊二者的区别。…