Go语言入门【6】切片

news2024/11/25 4:47:54

切片

在go语言中,切片是对数组的抽象,数组在声明时指定了长度之后就不可再进行改变,在特定场景下数组就不适用,所以就有了切片类型,切片就是“动态数组”,和数组相比,切片的长度是不固定的,可以在切片后面追加元素,长度自动扩容。

切片定义

定义切片和定义数组很像,区别就是定义一个切片不需要指定长度。

var 切片名 []类型

切片还可以使用make函数定义。

make([]T, length, capacity)

make函数有三个参数:

  1. 第一个参数为切片类型,可以是[]int,[]string,[]float32等。
  2. 第二个参数为切片初始长度。
  3. 第三个为切片容量,该参数为可选参数。

切片初始化

一个切片在初始化之前为空切片(nil),长度为0,可以在声明切片时直接初始化切片,如下表示声明一个int切片,初始化值为{1, 2, 3}

s :=[] int {1,2,3 }

初始化为数组的引用,假设有一个数组arr,在初始化为数组的引用时,通过开始索引和结束索引控制初始化的切片大小和切片内元素个数。

s := arr[startIndex:endIndex]	// 从 startIndex 到 endIndex - 1 初始化为一个切片
s := arr[startIndex:]			// 从 startIndex 到 数组结尾 初始化为一个切片
s := arr[:endIndex]				// 从 数组开始 到 endIndex - 1 初始化为一个切片
s := arr[:]						// 从 数组开始 到 数组结尾 初始化为一个切片(整个数组)

代码示例:

package main

import "fmt"

func main() {
	arr := [5]int{1, 2, 3, 4, 5}
	s1 := arr[:]
	s2 := arr[2:]
	s3 := arr[:3]
	s4 := arr[1:4]
	fmt.Println(s1)
	fmt.Println(s2)
	fmt.Println(s3)
	fmt.Println(s4)
}

运行结果:

运行结果

append和copy

append表示在一个切片的末尾追加元素。

copy表示复制一个切片里面的元素到另一个切片。

代码示例:

package main

import "fmt"

func main() {
	s := []int{1,2,3}
	fmt.Println("切片s:",s)
	s = append(s, 4)					// 添加一个元素4到切片s中
	fmt.Println("切片s:",s)
	s1 := make([]int, 4)
	copy(s1, s)											// 将切片s的内容拷贝到切片s1中
	fmt.Println("切片s1:",s1)
}

运行结果:

运行结果

切片截取

切片截取使用中括号[],通过指定需要截取的开始索引和结束索引。

代码示例:

package main

import "fmt"

func main() {
	s := []int{1,2,3,4,5}
	fmt.Println("完整切片:", s)
	fmt.Println("s[1:3]:", s[1:3])			// 截取索引1(包含)到索引3(不包含)
	fmt.Println("s[:4]:", s[:4])			// 默认开始索引为0
	fmt.Println("s[2:]:", s[2:])			// 默认结束索引为len
}

运行结果:

运行结果

len和cap

长度和容量区别:

  • 长度:长度表示切片中实际存储的元素个数
  • 容量:容量表示切片底层使用的数组的大小

当定义一个切片时,如果没有通过make方法指定cap,则底层会申请一个和切片长度一样的数组,这个数组的大小就是cap,当使用append朝切片中追加元素时,如果追加元素后新的len小于cap,则底层数组不会改变,当新的len大于cap时,底层就会重新申请一个数组,且数组的长度为cap * 2,然后将之前数组的元素全部复制到新数组中。

代码示例:

package main

import "fmt"

func main() {
	s := make([]int, 3)
	fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// 此时len=3,cap=3

	s = append(s, 1)
	fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// append一个元素,len=4,大于cap,所以底层数组扩容,cap=6

	s = append(s, 1)
	fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// append一个元素,len=5,小于cap,底层数组不变,cap=6

	s = append(s, 1)
	fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// append一个元素,len=6,小于cap,底层数组不变,cap=6

	s = append(s, 1)
	fmt.Printf("len:%d, cap:%d \n", len(s), cap(s))		// append一个元素,len=7,大于cap,所以底层数组扩容,cap=12
}

运行结果:

运行结果

关注专栏,持续更新

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

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

相关文章

mybatis逆向工程的实现

在本地创建一个test数据库,并在test数据库中创建一个student表;表中的数据如下: 创建表: DROP TABLE IF EXISTS student; CREATE TABLE student ( studentID int NOT NULL AUTO_INCREMENT, StudnetName varchar(20) CHARACTER SET…

Linux 之 Ubuntu 下安装配置ARM交叉编译器(工具链)的简单整理

Linux 之 Ubuntu 下安装配置ARM交叉编译器(工具链)的简单整理 目录 Linux 之 Ubuntu 下安装配置ARM交叉编译器(工具链)的简单整理 一、简单介绍 二、下载 arm 交叉编译安装工具包,并安装到虚拟机中 一、简单介绍 Linux/Ubuntu 开发的一些知识整理,方…

微服务基础设施选型

微服务基础设施架构 全貌 优先级 微服务框架模式 核心 服务注册、服务发现、服务路由 模式1-嵌入SDK 优点 架构简单,天然支持高性能、高可用维护简答,无需维护独立的Proxy节点 缺点 应用侵入,需要集成SDK,并联动升级多语言重…

强化学习 Lesson2 学习笔记

Lesson2-1 MDP、Q表格 一、强化学习MDP四元组<S,A,P,R> S:state 状态A:action 动作R:reward 奖励 r[st,at]P:probability 状态转移概率 p[st1,rt|st,at] 强化学习是一系列决策的过程,通过当前的环境状态和收到的奖励来决定下一次执行的动作 ​ Model-based: P函数和R函…

零售业迎来全新发展,这个技术少不了

零售业在创新方面比较频繁&#xff0c;创新是推动零售业发展的动力&#xff0c;这可以让零售业具有了外在的生命力和内在的动力。创新要求零售商从内部建立机制&#xff0c;以创新的心态经营管理。 现在&#xff0c;零售商陷入泥潭。其中一个原因是&#xff0c;他们失去了创新能…

Docker详解(一)

文章目录参考资料一、Docker基本概念二、Docker安装1. 卸载旧版本2. 使用 Docker 仓库进行安装设置仓库安装 Docker Engine-Community卸载 Docker安装Docker CE 环境三、Docker命令1. Docker容器运行流程2. 镜像命令docker images 查看所有本地主机上的镜像docker search 搜索镜…

后端自学两个小时前端,究竟能做出什么东西?

又来给大家更文了&#xff0c;今天是微服务网关实战的第六篇。 今天的内容比较偏前端一点&#xff0c;主要是给大家换换口味&#xff0c;毕竟学一个东西学久了就想学点新东西休息一点&#xff0c;俗称换换脑子。 其实早就想学学前端看了&#xff0c;不过碍于工作繁忙&#xf…

冒泡排序和数据结构和算法可视化网站(及其一点小优化)

目录 一、冒泡排序的原理 二、动图演示原理 三、代码实现&#xff1a; 四、优化后的冒泡排序 五、算法演示网站 一、冒泡排序的原理 冒泡排序就是两两交换&#xff0c;第一趟排序可以得到最大值&#xff0c;那么第二趟排序就不用再比较最大值了&#xff0c;同样是两两交换…

电商后台管理系统(基于SSM + Vue + Restful + jquery + axios)

1.项目架构 2.config配置 JdbcConfig public class JdbcConfig {Value("${jdbc.driver}")private String driver;Value("${jdbc.url}")private String url;Value("${jdbc.username}")private String username;Value("${jdbc.password}&qu…

Spring——五大类注解和方法注解详解

文章目录1.Spring的创建2.Spring对象的存储3.将 Bean 对象通过配置文件注册到 Spring 当中4.从 Spring 中将 bean 对象读取出来并使用4.1 先得到 Spring 上下文对象4.2 再通过上下文对象提供的方法获取需要使用的baen对象4.3 使用bean对象[可选步骤]4.4 获取 getBean 的更多方法…

易基因技术推介|m1A RNA甲基化测序(MeRIP-seq/m1A-seq)

N1-甲基腺苷&#xff08;N1-methyladenosine&#xff0c;m1A&#xff09;是一种普遍存在于真核生物tRNA、rRNA和mRNA且可逆的转录后RNA修饰。基于高通量测序技术最新研究揭示m1A RNA修饰在基因调控和生物过程中的关键作用&#xff1a;对RNA稳定性和翻译起始等过程有着重要调节作…

Mybatis+Spring+SpringMVC及SSM整合

文章目录一、Mybatis&#xff08;一&#xff09;Mybatis简介1、Mybatis历史2、Mybatis特性3、Mybatis下载4、和其它持久化层技术对比&#xff08;二&#xff09;搭建Mybatis1、MySQL不同版本的注意事项2、创建Maven工程1、引入依赖3、创建MyBatis的核心配置文件3.1、核心配置文…

WRF进阶:WRF中Noah-MP地面方案中雪反照率的计算

Noah-MP简介 Noah-MP是以Noah-LSM为基础发展的一种多层模型&#xff0c;相对于Noah-LSM&#xff0c;它对于下垫面的冠层、土壤、积雪有了更多的拓展。 Noah-MP允许3层雪&#xff0c;对于雪的模拟有了极大的提升&#xff0c;同时&#xff0c;Polar-WRF中对Noah LSM和Noah MP中海…

IIS 部署HTTP 转 HTTPS完整版

1,准备SSL证书&#xff0c;阿里云有1年免费证书 免费证书有 20个&#xff0c;每年用一个就行 审核通过后下载 下载文件包含证书文件和密码 2.安装重定向模块 如果IIS上默认有安装Web平台安装程序&#xff0c;我们可以使用平台自动安装URL Rewrite重写工具&#xff0c;也可以…

Tomcat日志分割

使用cronolog日志切分工具 RPM包下载方法&#xff1a;在 rpmfind.net 上搜索cronolog选择对应RPM包复制下载链接即可 下载安装 cronolog yum install https://rpmfind.net/linux/epel/7/x86_64/Packages/c/cronolog-1.6.2-14.el7.x86_64.rpm -y验证是否安装成功及安装位置 使…

《安卓逆向》Magisk的编译踩坑记录-安装方法-分享魔改后的Magisk过root检测方法

为什么: 1.体验下如何编译面具源码 2.魔改面具-绕过更深的root检测 1.ubuntu 虚拟机下载地址 http://mirrors.aliyun.com/ubuntu-releases/20.04/github:https://github.com/topjohnwu/Magisk 编译根据这篇文章做好前缀下代码工作 https://zhuanlan.zhihu.com/p/385255256编…

图片1920x1080分辨率怎么调 ?图片如何修改分辨率?

图片是我们日常生活中经常需要使用到的东西&#xff0c;但是在使用图片时我们会遇到需要调图片分辨率的情况&#xff0c;有很多小伙伴对于图片分辨率这个概念并不了解&#xff0c;今天就来为大家具体介绍一下图片1920x1080怎么调以及怎么给图片修改分辨率&#xff0c;下面一起来…

美食杰项目 -- 首页(一)

目录前言&#xff1a;具体实现思路&#xff1a;步骤&#xff1a;1. 展示美食杰项目首页效果2. 引入 element-ui3. 头部代码4. 首页内容总代码5. 轮播图代码6. 已发布菜品内容代码7. 加载图片页面代码总结&#xff1a;前言&#xff1a; 本文给大家讲解&#xff0c;美食杰项目中…

Windows右键菜单美化(适用版本:Win7-Win11) 奇怪的美化教程 #1

在我的上篇文章中&#xff0c;只有 0% 的人点了赞 咋一人没有啊&#xff01; 所以如果觉得做的还行的话可以给我点个赞、收个藏&#xff0c;这对我真的很重要&#xff01;QWQ 祖传前言 众所周知&#xff0c; Windows11 整了个新的右键菜单 (而原来的右键菜单变成了 显示更多…

基于微信小程序的桥牌计分系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…