go语言初识别(五)

news2024/11/27 8:35:17

本博客内容涉及到:切片

切片

1. 切片的概念

首先先对数组进行一下回顾:

  1. 数组定义完,长度是固定的,例如:
var num [5]int = [5]int{1,2,3,4,5}

定义的num数组长度是5,表示只能存储5个整形数字,现在向数组num追加一个数字,代码会出错。
2. 使用数组作为函数参数进行传递时,如果实参为5个元素的整形数组,那么形参也必须为5个元素的整形数组,否则出错。
而切片是一个可变长的序列(可以追加元素),可以包含任意类型的元素。切片比数组更灵活,更强大。

2. 切片和数组的区别

package main

import "fmt"

/*
演示切片和数组有什么区别
*/

func main() {
	// 数组的基本定义
	a := [5]int{}
	fmt.Println(a)
	// 切片的基本定义
	s := []int{}
	fmt.Println(s)
}

输出结果:
在这里插入图片描述
在数组定义过程中,必须指定数组的长度,并且在未给数组赋值时,数组元素默认为0。在给切片定义过程中[]内无需赋值,且未进行赋值的切片为空。
下面使用append()函数给切片追加数据。
【注意】:
使用append()函数,当容量小于1024时是按照2倍容量扩容,当大于1024时不是按照两倍容量进行扩容(每次约增加当前容量的1/4)。

	s = append(s, 1, 2, 3, 4, 5, 6)
	fmt.Println(s)

输出结果:
在这里插入图片描述
append()函数中,第一个参数表示向哪个切片追加数据,后面表示具体追加的数据。

3.切片的定义方式

下面演示了切片的三种定义方式:

package main

import "fmt"

/*
演示切片的定义方式
*/

func main() {
	// 第一种
	s1 := []int{}
	fmt.Println(s1)

	// 第二种
	var s2 []int //只是缺少了长度
	fmt.Println(s2)

	// 第三种
	s3 := make([]int, 5, 10) // 其中5是长度,10 是容量
	fmt.Println(s3)
}

输出结果:
在这里插入图片描述
使用make()函数时,前面一个数字为函数切片的长度,后面的那个数字是切片的容量。
**长度:**已经初始化的空间,切片初始空间默认值都是0。
**容量:**已经开辟的空间,包括已经初始化的空间和空闲的空间。
【注意】:
使用make()函数时,切片的长度一定要小于容量。
切片赋值方式与数组相同。

4.切片截取

下面程序演示了切片的截取操作:

package main

import "fmt"

/*
演示切片的截取
*/
func main() {
	s := []int{1, 2, 3, 4, 5, 7, 8, 9, 10}

	// 从切片中截取数据
	slice := s[1:3:5]
	fmt.Println(slice)
}

输出结果:
在这里插入图片描述
解释s[1:3:5]
可以使用s[low: high: max]来表示:

  1. low:表示下标的起点,从该位置开始截取。
  2. high:表示取到哪结束,也就是下标的终点(不包含该位置)。左闭右开区间。
  3. max:用来计算容量,使用max-low可以计算出容量为多少。

在这里插入图片描述

5.修改截取切片的值

修改截取过后的新切片的值会影响到原来切片的值。

package main

import "fmt"

/*
演示修改截取的新切片的值,会影响到原切片的值
*/

func main() {
	s := []int{1, 2, 3, 4, 5, 6, 7, 8, 10}

	fmt.Println(s)

	s1 := s[2:5]
	fmt.Println(s1)

	s1[0] = 100
	fmt.Println(s1)
	fmt.Println(s)
}

输出如下:
在这里插入图片描述
切片进行截取操作后,截取后的切片指向的是原有的切片,所以在修改新切片的值会影响到原切片。

6. copy函数的使用

针对切片的操作常用的方法除了append()方法外,还有copy方法。
基本语法:copy(切片1, 切片2)
将第二个切片中的元素,拷贝到第一个切片中。

package main

import "fmt"

/*
演示切片的拷贝
*/
func main() {
	s1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	s2 := []int{1, 1, 1, 1, 1, 1}

	copy(s1, s2)
	fmt.Println(s1)
}

输出结果:
在这里插入图片描述
copy()函数会使第二个切片中的值将第一个元素中的值覆盖。

7.切片作为函数参数

同其它数据类型一样,切片也可作为函数参数:

package main

import "fmt"

/*
演示切片作为函数参数
*/

func InitData(num []int) {
	for i := 0; i < len(num); i++ {
		num[i] = i
	}
}

func main() {
	// 创建一个切片
	s := make([]int, 10)
	// 使用函数初始化切片
	InitData(s)
	// 打印切片中的内容
	fmt.Println(s)
}

输出结果如下:
在这里插入图片描述
通过这个程序可以发现,定义了一个切片s,然后调用InitData()函数,将切片s作为实参传递到该函数中,并在函数中对形参num赋值,影响到了main()函数中的切片s.
接下来对比数组作为参数时,是否会影响到main()函数中的值:

package main

import "fmt"

/*
演示数组作为函数参数时,是否会影响到main()函数中的值
*/

func InitData(num [10]int) {
	for i := 0; i < len(num); i++ {
		num[i] = i
	}
}

func main() {
	// 创建一个数组
	var s [10]int
	// 使用函数初始化切片
	InitData(s)
	// 打印数组中的内容
	fmt.Println(s)
}

输出结果如下:
在这里插入图片描述
可以看到, 同样的操作,但是InitData()函数并未将main()函数中的数组值改变。
值传递和引用

  1. 值传递:方法调用时,实参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
  2. 引用传递:也称为传地址。函数调用时,实际参数的引用(地址,而不是参数的值)被传递给函数中相对应的形式参数(实参与形参指向了同一块存储区域)。在函数执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数数值的改变将会影响时间参数的值。

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

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

相关文章

轻松拿捏C语言——自定义类型之【结构体】

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f389;创作不易&#xff0c;请多多支持&#x1f389; &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; &#x1f339;如有问题&#xff0c;欢迎指正 1. 结构体类型的…

《当微服务遇上Ribbon:一场负载均衡的华丽舞会》

在微服务的厨房里&#xff0c;如何确保每一道服务都恰到好处&#xff1f;揭秘Spring Cloud Ribbon如何像大厨一样精心调配资源&#xff0c;让负载均衡变得像烹饪艺术一样简单&#xff01; 文章目录 Spring Cloud Ribbon 详解1. 引言微服务架构中的负载均衡需求Spring Cloud Rib…

【chagpt】广泛使用API之前:考虑成本和数据隐私

文章目录 一. 定价和标记限制二. 安全和隐私 在广泛使用API之前&#xff0c;应该考虑两个重要因素&#xff1a;成本和数据隐私。 一. 定价和标记限制 OpenAI在Pricing页面上列出了模型的定价。请注意&#xff0c;OpenAI不一定及时更新该页面上的定价信息&#xff0c;因此实际…

爱岗敬业短视频:成都科成博通文化传媒公司

爱岗敬业短视频&#xff1a;传递正能量&#xff0c;塑造职场新风尚 在当今社会&#xff0c;短视频以其独特的传播方式和广泛的受众群体&#xff0c;成为了信息传播的重要渠道。在众多短视频内容中&#xff0c;以“爱岗敬业”为主题的短视频尤为引人注目&#xff0c;成都科成博…

链表mark

什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff08;空指针的意思&#xff09;。…

《TCP/IP网络编程》(第十一章)进程间通信

进程间通信意味着两个不同的进程间可以交换数据&#xff0c;它使得不同的进程能够协同工作&#xff0c;实现复杂的系统功能。 1.通过管道实现进程间通信 下图是基于 管道&#xff08;PIPE&#xff09; 的进程间通信结构模型 管道不属于进程的资源&#xff0c;属于操作系统的资…

怎么简单的把图片缩小?图片在线改大小的方法

在日常工作中经常需要在网上上传图片&#xff0c;但是一般网上不同的平台对上传的图片大小和尺寸都会有限定的要求&#xff0c;不符合要求无法正常上传使用。所以当遇到图片太大的问题时&#xff0c;该如何快速修改图片大小&#xff0c;有很多的小伙伴都很关注这个问题的解决方…

qmt量化交易策略小白学习笔记第7期【qmt策略之股票快照指标】

qmt策略之股票快照指标 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;需免费开通量化回测与咨询实盘权限&#xff0c;可以和博主联系&#xff01; 股票快照指标 提供标…

趣店集团golang一面要个20K,Channel什么情况下会出现死锁,有遇到过吗?

结束后面试官加了VX&#xff0c;并询问方便二面的时间&#xff0c;一直还没回复&#xff0c;拖着拖着给忘啦... 面试题 1、自我介绍 2、你在团队里头负责哪一块&#xff0c;这个物流开放平台流量多大 3、为什么今年3月份被从物流开放团队转到了finance财务部门&#xff0c;感…

VSCODE中F12无法跳转,快捷键设置F12和insert混淆了

异常现象 最近用新电脑&#xff08;华为&#xff09;的时候&#xff0c;发现VSCODE经常按F12无法跳转&#xff0c;在快捷键设置当中&#xff0c;也是设置成功的&#xff1b; 此时重新去快捷键设置&#xff0c;会发现按 F12变为了Insert 解决方法 华为笔记本的Fx按键&#x…

YashanDB携手慧点科技完成产品兼容认证 助力国产信创生态建设

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与慧点科技顺利完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;共同支撑政府、企业、金融等办公应用场景下的数字化转型升级&#xff0c;为企业的信息技术应用创新提供坚…

如何彻底卸载sql sever2022

目录 背景过程1、关闭sql sever服务2、打开控制面板&#xff0c;卸载SQL Sever3、手动删除 SQL Server 遗留文件4、清空注册表5、重启计算机以确保所有更改生效。 总结 背景 重装了电脑&#xff0c;安装sqlServer&#xff0c;一直报错&#xff0c;不成功&#xff0c;所以每次安…

AAAI2024 基于扩散模型 多类别 工业异常检测 DiAD

前言 本文分享一个基于扩散模型的多类别异常检测框架&#xff0c;用于检测工业场景的缺陷检测或异常检测。 设计SG语义引导网络&#xff0c;在重建过程中有效保持输入图像的语义信息&#xff0c;解决了LDM在多类别异常检测中的语义信息丢失问题。高效重建&#xff0c;通过在潜…

装机必备——Bandizip7.33安装教程

装机必备——Bandizip7.33安装教程 软件下载 软件名称&#xff1a;Bandizip7.33 软件语言&#xff1a;简体中文 软件大小&#xff1a;8.42M 系统要求&#xff1a;Windows7或更高&#xff0c; 64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 下载通道①迅…

基坑气膜:建筑工地环保新利器—轻空间

随着城市化进程的加快&#xff0c;建筑行业的飞速发展带来了严重的环境问题&#xff0c;如噪音和粉尘污染&#xff0c;给人们的生活带来诸多不便。为了解决这些问题&#xff0c;建筑行业一直在探索更为环保和高效的施工方式。近年来&#xff0c;基坑气膜技术逐渐崭露头角&#…

编程零基础,如何学习Python?

初学者选择Python入手着实是一个不错的方向&#xff0c;入手简单且广泛的运用是它最显著的特色了。 那有几个问题&#xff0c;我想是开始学习Python之前应该了解的&#xff0c; python能做什么&#xff1f; 发展前景与工作机会有哪些&#xff1f; 需要学习哪些内容&#xf…

go-zero 实战(4)

中间件 在 userapi 项目中引入中间件。go项目中的中间可以处理请求之前和之后的逻辑。 1. 在 userapi/internal目录先创建 middlewares目录&#xff0c;并创建 user.go文件 package middlewaresimport ("github.com/zeromicro/go-zero/core/logx""net/http&q…

实战

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 实战一&#xff1a;输出“王者荣耀”的游戏角色 “王者荣耀”游戏中有很多英雄&#xff0c;这些英雄可以分为法师、战士、坦克、刺客、射手和辅助。…

Python---Matplotlib(2万字总结)【从入门到掌握】

数据可视化 在完成了对数据的透视之后&#xff0c;可以将数据透视的结果通过可视化的方式呈现出来&#xff0c;简单的说&#xff0c;就是将数据变成漂亮的图表&#xff0c;因为人类对颜色和形状会更加敏感&#xff0c;然后再进一步解读数据背后隐藏的价值。在之前的文章中已经…

OSPF优化——OSPF减少LSA更新量2

二、特殊区域——优化非骨干区域的LSA数量 不是骨干区域、不能存在虚链路 1、不能存在 ASBR 1&#xff09;末梢区域 该区域将拒绝 4、5LSA的进人&#xff0c;同时由该区域连接骨干0区域的ABR 向该区域&#xff0c;发布一条3类的缺省路由; 该区域内每台路由器均需配置&#xf…