GO学习之切片操作

GO系列

1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作

文章目录

  • GO系列
  • 前言
  • 一、什么是切片(和数组有什么关系)
  • 二、切片基本操作
    • 2.1 切片定义
    • 2.2 添加元素
    • 2.3 删除元素
    • 2.4 遍历
    • 2.5 自定义contains函数
  • 三、总结

前言

按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
前面学了一些 go 的基础知识,比如说 go 语言的基础,go 的数据类型和一些基本操作,if else switch for 等语法,当然除了简单的一些变量定义还有稍微复杂的,就是数据和切片了,那就针对切片专门进行学习一下,毕竟在开发中 切片 也是使用比较多的。

一、什么是切片(和数组有什么关系)

什么是切片呢?切片(Slice)是 Go 语言中的一种动态长度的数据结构,它是对数组的一个连续片段的引用,并且提供了一种方便且灵活的方式来操作和管理一组相同类型的元素。

切片的定义:

  1. 切片由三部分组成:指针长度容量
  2. 指针指向数组的第一个元素,切片的长度表示切片表示当前存储元素的个数,容量表示切片底层数组的长度

切片和数组有什么关系呢?

  1. 切片是数组的一个连续片段的应用,提供了一种动态大小的、方便的方式来操作数组。
  2. 切片和数组的底层数据结构是相同的,都是连续的内存块,但是切片是一个动态长度的视图,而数组的长度是固定的。
  3. 对切片的修改会影响底层数组,因为切片是对数组的引用。同样的,对底层数组的修改也会影响切片。

总结起来,切片是一种方便且灵活的动态长度的数据结构,它是对数组的引用。通过切片,我们可以动态操作数组中的一部分元素,同时也提供了方便的切片操作和动态调整大小的能力。
切片和数组密切相关,切片提供了对底层数组的引用和操作,可以说切片是数组的一种便捷封装。

二、切片基本操作

2.1 切片定义

切片声明的方式有好几种, 可以直接 var arr []int,也可以通过 make 来初始化,或者直接可以简写为 s5 := []int{1, 2, 3},也可以直接在为数组的一部分,具体看代码:

package main
import "fmt"
func main() {// 声明切片var s1 []ints2 := []int{}// 通过 make 来创建分片var s3 []int = make([]int, 10)var s4 []int = make([]int, 0, 5)// 简写方式s5 := []int{1, 2, 3}arr := [5]int{1, 2, 3, 4, 5}var s6 []int// 声明切片为数组的部分s6 = arr[1:4]if s1 == nil {fmt.Println("s1 is nil")}fmt.Println("s1: ", s1)fmt.Println("s2: ", s2)fmt.Println("s3: ", s3)fmt.Println("s4: ", s4)fmt.Println("s5: ", s5)fmt.Println("s6: ", s6)
}

执行结果:

s1 is nil
s1:  []
s2:  []
s3:  [0 0 0 0 0 0 0 0 0 0]
s4:  []
s5:  [1 2 3]
s6:  [2 3 4]

2.2 添加元素

使用 append 函数来对切片进行添加元素操作。

package main
import "fmt"
func main() {var list []intfor i := 0; i < 5; i++ {// 添加元素list = append(list, i)}list = append(list, 100)fmt.Println("list: ", list)
}

执行结果:

list:  [0 1 2 3 4 100]

2.3 删除元素

需要注意的是,go 语言中对切片的元素删除不像 JAVA 中对 List 中元素的删除,直接用 remove() 方法,go 语言中切片没有函数来删除元素,这是因为在 go 语言中,切片的删除操作可以通过切片的切片操作来重新赋值实现,不需要专门的函数。
下面的实例是移除第二个元素。

package main
import "fmt"
func main() {data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}// 删除元素data3 := append(data[:2], data[3:]...)fmt.Println("被删除后的数组为:", data3)
}

执行结果:

被删除后的数组为: [0 1 3 4 5 6 7 8 9]

2.4 遍历

切片遍历可以直接用 for range 来实现,下面示例中,index 是下标,value 是值;
有时候我们只需要遍历 切片,但是不需要知道下标,可以用下划线 “_” 来代替,就是忽略下标的意思。

package main
import "fmt"
func main() {// 切片遍历data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}slice := data[:]for index, value := range slice {fmt.Printf("index %v 的值为 %v \n", index, value)}// 需要 下标(index) 的写法for _, value := range slice {fmt.Println(value)}
}

执行结果:

index 0 的值为 0
index 1 的值为 1
index 2 的值为 2
index 3 的值为 3
index 4 的值为 4
index 5 的值为 5
index 6 的值为 6
index 7 的值为 7
index 8 的值为 8
index 9 的值为 9

2.5 自定义contains函数

如果你写 JAVA 就会知道,我们判断一个元素是否在 List 中,可以直接调用 contains() 方法,但是在 go 语言中,却没有这个函数。
在上面的示例中,我们定义了一个名为 contains 的函数,它接受一个切片和一个要查找的元素作为参数。函数内部使用循环遍历切片,并逐个比较元素的值与目标元素是否相等。如果找到相等的元素,则返回 true 表示元素存在于切片中;

package main
import "fmt"
func main() {//定义数组data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}//切片slice := data[:]element := 5if contains(slice, element) {fmt.Println(element, " 在切片slice2中...")} else {fmt.Println(element, " 不在切片slice中...")}
}func contains(data []int, element int) bool {for _, value := range data {if value == element {return true}}return false
}

三、总结

看到这里,go 语言中的切片就基本有了了解,也能写一写简单的功能了,不过相对于JAVA来说,go 语言中好多地方还是大不相同的,就对切片来说,表面上有点类似于 JAVA 的 ArrayList,但其实大相径庭,也需要更加去使用和了解才能正在的懂什么是切片。
那为什么 JAVA 中对 ArrayList 操作由 remove、contains等方法,但是 go 中却没有这样的函数呢?

是因为 go 语言的设计哲学强调简洁性和效率,保持语言的简介和清晰,尽量避免引入过多的内置函数和语法糖,让程序员能够简洁的方式表达意图,相对于大量的内置函数,go 语言更倾向于提供基础的数据结构和少了的核心函数,以便程序员构建自己的函数和工具。
不过,go 语言社区拥有丰富的第三方包和库,包含了各种函数和工具,我们可以寻找合适的第三方包,集成到我们自己的项目中使用。

切片就到这里吧!
感谢阅读!!!如有不妥之处欢迎纠正

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

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

相关文章

商品信息管理-亿发商品进销存管理系统,批发行业零售门店免费试用

众所周知&#xff0c;批发零售行业面临着商品品类繁多、品牌众多、商品信息量庞大等挑战。同时&#xff0c;商品售价波动频繁&#xff0c;还需要管理商品批次&#xff0c;避免积压过期。针对这些传统批发零售行业的管理难题&#xff0c;加快行业数字化转型成为解决之道&#xf…

不同局域网下使用Python自带HTTP服务进行文件共享「端口映射」

文章目录 1. 前言2. 视频教程3. 本地文件服务器搭建3.1 python的安装和设置3.2 cpolar的安装和注册 4. 本地文件服务器的发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有…

目标检测——FasterRCNN原理与实现

目录 网络工作流程数据加载模型加载模型预测过程RPN获取候选区域FastRCNN进行目标检测 模型结构详解backboneRPN网络anchorsRPN分类RPN回归Proposal层 ROIPooling目标分类与回归 FasterRCNN的训练RPN网络的训练正负样本标记RPN网络的损失函数训练过程实现正负样本设置损失函数 …

Apache Doris (三十):Doris 数据导入(八)Spark Load 3- 导入HDFS数据

目录 1. 准备HDFS数据 2. 创建Doris表 3. 创建Spark Load导入任务 4. 查看导入任务状态 进入正文之前&#xff0c;欢迎订阅专题、对博文点赞、评论、收藏&#xff0c;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; 宝子们订阅、点赞、收藏不迷路&#xff01;抓紧…

echarts实现渐变折线图并添加点击事件

折线图点击事件代码: let myChart = this.$echarts.init(document.getElementById(trendBoxECharts))myChart.getZr().on(click, params => {console.log(params)let pointInPixel = [params.offsetX, params.offsetY]if (myChart.containPixel(grid, pointInPixel)) {//点…

【JAVA】云HIS系统功能菜单知识(一)

一、云HIS特色 云HIS滚动消息栏&#xff1a;质控消息、住院时长、药库结转、患者入院、医嘱停止、新开医嘱、门诊用药不良、出院审核、药品调拨、排班提醒、药品库存、药品过期、药品临期等帮助医生、护士和相关管理人员实时接收院内消息并作出处理。 二、云HIS功能菜单 【预约…

表关系分析与创建

表关系的分类 &#xff08;一&#xff09;多表查询一对一&#xff1a;models.OneToOneField(to_fieldid,toAuthordatil)一对多&#xff1a;&#xff08;外键设置唯一性&#xff09;models.ForeignKey(toPublish,to_fieldid)多对多&#xff1a;自动生成第三张表models.ManyToMa…

8、gateway使用和原理

一、什么是Spring Cloud Gateway 1、网关简介 网关作为流量的入口&#xff0c;常用的功能包括路由转发&#xff0c;权限校验&#xff0c;限流等。 2、Gateway简介 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架&#xff0c;定位于取代 Netflix Zuul。相比 …

省电液晶驱动IC,VK2C22G,COG片高抗干扰抗噪系列LCD段码驱动芯片,I2C通信接口

型号:VK2C22G DICE(邦定COB)/COG&#xff08;绑定玻璃用&#xff09; VK2C22G概述&#xff1a; VK2C22G是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大176点&#xff08;44SEGx4COM&#xff09;的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据&#…

计算机网络 day7 扫描IP脚本 - 路由器 - ping某网址的过程

目录 network 和 NetworkManager关系&#xff1a; 实验&#xff1a;编写一个扫描脚本&#xff0c;知道本局域网里哪些ip在使用&#xff0c;哪些没有使用&#xff1f; 使用的ip对应的mac地址都要显示出来 计算机程序执行的两种不同方式&#xff1a; shell语言编写扫描脚本 …

Kubernetes 集群管理和编排

文章目录 总纲第一章&#xff1a;引入 Kubernetes什么是容器编排和管理&#xff1f;容器编排和管理的重要性Kubernetes作为容器编排和管理解决方案 Kubernetes 的背景和发展起源和发展历程Kubernetes 项目的目标和动机 Kubernetes 的作用和优势作用优势 Kubernetes 的特点和核心…

抽象轻松JavaScript

这一期的内容为时间日期 核心 目的&#xff1a;获取当前或者自定义时间日期 语句&#xff1a;Date() 定义&#xff1a;呈现时间中的某个时刻&#xff0c;以毫秒为单位 简单运用 获取脚本运行时间 第一种写法&#xff1a;用Date()对象 let TimeStart new Date();for(let…

C# 通过枚举类型字符串,反射到枚举上

C# 通过枚举类型字符串&#xff0c;反射到枚举上 通过类型字符串&#xff0c;反射出任意类型枚举类型通过反射调用枚举GetTypeByName(EnumName) 为空&#xff1f; 小结 通过类型字符串&#xff0c;反射出任意类型 之前老顾写过一篇博客&#xff0c;通过反射&#xff0c;使用字…

IDEA+java+spring+hibernate+jquery+mysql后台管理系统

IDEA javaspringhibernatejquerymysql后台管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.我的内容4.我的操作日志5. 我的登陆日志6. 我的登陆授权7. 内容管理8.标签管理9. 搜索词管理10.分类管理11.分类类型12.标签分类13.用户管理14.部门管理15.角色…

Linux系统编程(信号处理机制)

文章目录 前言一、中断&#xff0c;异常&#xff0c;信号的区别二、信号在Linux中的标识三、信号处理相关函数四、代码实验总结 前言 本篇文章我们来讲解信号的处理机制&#xff0c;信号处理在Linux操作系统中必不可少&#xff0c;这一点值得大家注意&#xff0c;信号又会与中…

golang 日志库zap和日志切割实践

介绍 在许多Go语言项目中&#xff0c;我们需要一个好的日志记录器能够提供下面这些功能&#xff1a; 能够将事件记录到文件中&#xff0c;而不是应用程序控制台。 日志切割-能够根据文件大小、时间或间隔等来切割日志文件。 支持不同的日志级别。例如INFO&#xff0c;DEBUG&a…

深度学习与神经网络

人工智能&#xff0c;机器学习&#xff0c;深度学习&#xff0c;神经网络&#xff0c;emmmm&#xff0c;傻傻分不清楚&#xff0c;这都啥呀&#xff0c;你知道吗&#xff1f;我不知道。你知道吗&#xff1f;我不知道。 来来来&#xff0c;接下来&#xff0c;整硬菜&#xff1a…

『红外图像 数据增强』DDE(Digital Detail Enhancement)算法

DDE处理的细节 分离背景层和细节层&#xff1a;使用特殊的滤波器&#xff0c;将图像分成背景层和细节层。背景层通常包含低频信息&#xff0c;而细节层包含高频信息。 对背景层进行灰度增强&#xff1a;通过对背景层应用适当的灰度增强算法&#xff0c;提高背景层的对比度和视…

轻量级应用服务器开放端口

关于使用浏览器连接自己所写的TCP进程时&#xff0c;由于没有开放端口&#xff0c;而且搜索到对应的操作来进行开放端口&#xff0c;所以在完成开放端口后特意做个笔记&#xff0c;防止忘记。 登录自己所使用的服务器的网站找到控制台 找到轻量级应用服务器 找到所需要开放端口…

【机器学习】分类算法 - KNN算法(K-近邻算法)KNeighborsClassifier

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;零基础快速入门人工智能《机器学习入门到精通》 K-近邻算法 1、什么是K-近邻算法&#xff1f;2、K-近邻算法API3、…