go语言初识别(五)

本博客内容涉及到:切片

切片

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【problem】解决EasyExcel导出日期数据显示为#####问题

前言 在使用EasyExcel进行数据导出时&#xff0c;你可能遇到日期或其他数据在Excel中显示为“#######”的情况&#xff0c;这通常是因为列宽不足以展示单元格内的全部内容。本文将指导你如何通过简单的步骤解决这一问题&#xff0c;并确保导出的Excel文件自动调整列宽或直接指…

调整图片和表格尺寸的命令:resizebox

\resizebox 是 LaTeX 中的一个命令&#xff0c;用于调整插入的内容&#xff08;如图像、表格、文本等&#xff09;的大小。它的语法如下&#xff1a; \resizebox{<width>}{<height>}{<content>}其中&#xff1a; <width> 和 <height> 分别表示…

Niantic利用Meta Llama让数字生物栩栩如生

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

代码随想录——平衡二叉树(Leetcode110)

题目链接 后序遍历高度&#xff0c;高度判断是否平衡 前序遍历深度 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* …

关于c++的通过cin.get()维持黑框的思考

1.前言 由于本科没有学过c语言&#xff0c;研究生阶段接触c上手有点困难&#xff0c;今天遇到关于通过cin.get()来让黑框维持的原因。 2.思考 cin.get()维持黑框不消失的原因一言蔽之就是等待输入。等待键盘的输入内容并回车&#xff08;一般是回车&#xff09;后cin.get()才…

Grafana详解

目录 ​编辑 一、Grafana的主要特点 二、Grafana的基本功能 三、Grafana的使用方法 Grafana是一款开源的数据可视化工具&#xff0c;主要用于大规模指标数据的可视化展现。下面将详细介绍Grafana的特点、功能以及基本使用方法。 一、Grafana的主要特点 跨平台性&#xff…

学习笔记——STM32F103V3版本——HC-05模块控制数码管

一.硬件 1.HC-05模块 2.数码管 3.连接硬件 二.在keil5中的代码 main.c代码&#xff1a; #include "stm32f10x.h" #include "buletooth.h" #include "led.h" #include "sys.h" #include "usart.h" #include "delay.…

【计算机毕业设计】基于SSM+Vue的线上旅行信息管理系统【源码+lw+部署文档】

目录 摘 要 第1章 绪论 1.1背景及意义 1.2 国内外研究概况 1.3 研究的内容 第2章 相关技术 2.1 Java简介 2.2 SSM三大框架 2.3 MyEclipse开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 第3章 系统分析 3.1 需求分析 3.2 系统可行性分析 3.2.1技术可行性&#xff1a;技术背景 …

aws eks集成wasm运行时并启动pod

参考资料 WebAssembly 在云原生中的实践指南&#xff0c;https://cloud.tencent.com/developer/article/2324065 作为一种通用字节码技术&#xff0c;wasm的初衷是在浏览器中的程序实现原生应用性能。高级语言将wasm作为目标语言进行编译并运行在wasm解释器中。和nodejs类似的…

大模型主流 RAG 框架TOP10

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…

大规模语言模型的书籍分享

在当今人工智能领域&#xff0c;大规模语言模型成为了研究和应用的热点之一。它们以其大规模的参数和强大的性能表现&#xff0c;推动着机器学习和深度学习技术的发展。对于GPT 系列大规模语言模型的发展历程&#xff0c;有两点令人印象深刻。 第一点是可拓展的训练架构与学习范…

2024年国内最全面最前沿人工智能理论和实践资料

引言 【导读】2024第11届全球互联网架构大会圆满结束。会议邀请了100余位行业内的领军人物和革新者&#xff0c;大会通过主题演讲、实践案例分享&#xff0c;以及前瞻性的技术讨论&#xff0c;探索AI技术的边界。 近日&#xff0c;备受瞩目的第十一届全球互联网架构大会&#x…

2024.05.28学习记录

1. 小林coding 计网复习 2.代码随想录刷题. 图论.和复习数组.链表 3.rosebush完成select组件

第十四届蓝桥杯c++研究生组

A 关键思路是求每个十进制数的数字以及怎么在一个数组中让判断所有的数字次数相等。 求每个十进制的数字 while(n!0){int x n%10;//x获取了n的每一个位数字n/10;}扩展&#xff1a;求二进制的每位数字 &#xff08;注意&#xff1a;进制转换、1的个数、位运算&#xff09; x…

单元测试的实现方式

单元测试的实现方式包括&#xff1a;人工静态检查、动态执行跟踪 人工静态检查 人工静态检查是一种单元测试实现方式&#xff0c;它主要依赖开发人员的人工代码审查和静态分析工具来识别潜在的代码问题。 代码审查&#xff1a;开发人员通过仔细检查代码来发现潜在的问题。他…

Warning: Each child in a list should have a unique “key“ prop.

问题描述&#xff1a; 使用ProTable的时候&#xff0c;报错如下 原因分析&#xff1a; 根据报错内容可以分析出&#xff0c;表格数据缺少唯一key&#xff0c; <PaginationTablecolumns{columns}pagination{{pageSize: 10,current: 1,showSizeChanger: true,showQuickJum…

最新!!2024年上半年软考【中级软件设计师】综合知识真题解析

2024上半年软考考试已经结束了&#xff0c;为大家整理了网友回忆版的软件设计师真题及答案&#xff0c;总共30道题。 上半年考试的宝子们可以对答案预估分数&#xff01;准备下半年考的宝子可以提前把握考试知识点和出题方向&#xff0c;说不定会遇到相同考点的题目&#xff01…

rk3568_semaphore

文章目录 前言1 什么是信号量1.1 信号量API函数2、信号量实验2.1 实验目的2.2函数源码2.3 运行结果图前言 本文记录rk3568开发板的信号量实验 1 什么是信号量 信号量是同步的一种方式,常常用于控制对共享资源的访问。 举个例子:停车场的停车位有100个,这100个停车位就是共…

代码模板,Cookie和Session

目录 代码模板 Cookie的基本使用 概念 Cookie的API public Cookie(String name, String value) 发送Cookie对象到客户端&#xff1a;使用response对象 创建Cookie对象并响应给浏览器 在服务器后端获取Cookie对象 Cookie[]cookiesrequset.getCookies(); Cookie的使用细…