go切片定义和初始化

news2025/3/10 5:34:49

1.简介

切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。切片的使用和数组类似,遍历切片、访问切片的元素和切片的长度都一样。。切片的长度是可以变化的,因此切片是一个可以动态变化的数组。

2.切片的定义基本语法

var 切片名 []类型

比如:var a []int

3.切片的初始化

3.1方式一

第一种方式:定义一个切片,然后让切片去引用一个已经创建好的数组。

    var arr = [...]int{1, 2, 3, 4, 5, 6}
	slice := arr[1:3]
    slice[0] = 100
	fmt.Println("arr:", arr)
	fmt.Println("slice:", slice)
    fmt.Println("slice长度:", len(slice))
	fmt.Println("slice容量:", cap(slice))

结果:

arr: [1 100 3 4 5 6]
slice: [100 3]
slice长度: 2
slice容量: 5

根据上面结果分析:切片的确是一个引用类型,改变slice的值会影响原数组。

其实切片底层其实就是一个数据结构

type slice struct{

ptr *[2]int

len int

cap int  }

3.2方式二

第二种方式:通过make来创建切片。

基本语法:var 切片名 []type=make([]type ,len,cap)

参数说明:type:就是数据类型 len:大小 cap:值切片的容量,可选,如果你分配了cap,则要求cap>=len。

    var SliceA = make([]int, 5, 6)
	SliceA[0] = 1
	fmt.Println(SliceA) //[0 0 0 0 0]
	fmt.Printf("长度:%d-容量%d", len(SliceA), cap(SliceA))

结果:

[1 0 0 0 0]
长度:5-容量6

对上面代码小结:

1.通过make方式创建切片可以指定切片的大小和容量。

2.如果没给切片的各个元素赋值,那么就会使用使用默认值 int 0 float 0  string “” bool false。

3.通过make方式船舰的切片对应的数组由make底层维护,对外不可见,即只能通过slice去访问各个元素。

3.3方式三

定义一个切片,直接指定具体的数组,使用原理类似make的方式。

    var strSlice = []string{"java", "php", "golang"}
	fmt.Println(strSlice)
	fmt.Printf("类型:%T\n", strSlice)
	fmt.Println("长度:", len(strSlice))
	fmt.Println("容量:", cap(strSlice))

 结果:

[java php golang]
类型:[]string
长度: 3
容量: 3

3.4方式一和方式二的区别

1.方式一是直接引用数组,这个数组是事先存在的,程序员可见的。

2.方式二是通过make来创建切片,make也会船舰一个数组,是由七篇在底层进行维护的,程序员是看不见的。make创建切片的示意图:

4.切片的扩容 

4.1append扩容

声明一个切片,golang中没办法通过下标方式给切片扩容,需要用到append()方法.比如
    var sliceB []int
	sliceB[0] = 2 //golang中没办法通过下标方式给切片扩容,需要用到append()方法.

会报错:panic: runtime error: index out of range [0] with length 0

    var sliceB []int
	sliceB = append(sliceB, 1)
	sliceB = append(sliceB, 123, 35, 67)
	fmt.Println(sliceB)
	fmt.Printf("长度:%v-容量:%v-%v-%T\n", len(sliceB), cap(sliceB), sliceB, sliceB)

结果:

[1 123 35 67]
长度:4-容量:4-[1 123 35 67]-[]int

4.2append方法合并切片

    sliceC := []string{"java", "go", "php"}
	sliceD := []string{"javad", "god", "phpd"}
	sliceC = append(sliceC, sliceD...)
	fmt.Println(sliceC)

 结果:

[java go php javad god phpd]

4.3切片的copy

已知切片是引用类型,更改切片的值会影响其他使用该切片的地方。

    sliceA := []string{"java", "php"}
	sleceB := sliceA
	var sliceC = make([]string, 2, 2)
	//copy()切片的复制
	copy(sliceC, sliceA)
	sleceB[0] = "golang"
	fmt.Println("sliceA:", sliceA)
	fmt.Println("sleceB:", sleceB)
	fmt.Println("sliceC:", sliceC)

结果:由结果可以看出,当sliceB改变了,对sliceC没有任何影响。

sliceA: [golang php]
sleceB: [golang php]
sliceC: [java php]

4.4切片的删除

删除下标为二的数据。

a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
	a = append(a[:2], a[3:]...)
	fmt.Println(a)

 结果:

[1 2 4 5 6 7 8 9 0]

 4.5切片cap容量的理解

切片的容量是从他的第一个元素开始数,到其底层数组元素末尾的个数。

示例1:

    a := [8]int{0, 1, 2, 3, 4, 5, 6, 7} // 引用的底层数组
	s1 := a[0:5]
	fmt.Printf("长度:%v-容量:%v\n", len(s1), cap(s1))

结果:由结果可知长度5容量8,a[0:5],从数组a第一个下标一直数到a数组的末尾个数0-7即cap=8.

长度:5-容量:8

 

 示例2:

    a := [8]int{0, 1, 2, 3, 4, 5, 6, 7} // 引用的底层数组
	s2 := a[3:6]
	fmt.Printf("长度:%v-容量:%v\n", len(s2), cap(s2))

结果:由结果可知长度3容量5,a[3:6],从数组a第一个下标一直数到a数组的末尾个数3-7即cap=5.

长度:3-容量:5

5.切片的遍历 

切片的遍历和数组一样,也有两种方式。

方式1:

for i := 0; i < len(slice); i++ {
		fmt.Println(slice[i])
	}

方式2:

    slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	for _, value := range slice {
		fmt.Println(value)
	}

结果:

1
2
3
4
5
6
7
8
9

6.切片的使用注意事项和细节讨论

7.1切片初始化是var slice=arr[stratIndex:endIndex]

说明:从arr数组小标围殴startIndex,取到下标为endIndex的元素,不包含arr[endIndex]

7.2切片初始化是,仍然不能越界。范围在[0-len(arr)]之间,但可以动态增长。

参考4.1append扩容

7.3cap是一个内置函数,用于统计切片的容量,即最大可以存放多少个元素。

 参考:4.5切片cap容量的理解

7.4切片定义完后,还不能直接使用,因为本身是一个空的,需要让你、昂起引用到一个数组,或者,make 一个空间供切片使用。

7.5切片可以继续切片

	A := []int{1, 2, 3, 4, 5, 6, 7, 8}
	B := A[3:8]
	C := A[:5]
	fmt.Println("B:", B)
	fmt.Println("C:", C)

结果:

B: [4 5 6 7 8]
C: [1 2 3 4 5]

7.6append()内置函数,可以对切片进行动态追加

用法:参考4.1、4.2

 切片append操作的底层原理分析:

切片append操作的本质就是对数组扩容,go底层会创建新的数组newArr(安装扩容后的大小),

将slice原来包含的元素拷贝到新的数组newArr,slice重新引用到newArr,注意newarr是底层来维护的,程序员不可见。

7.7 关于拷贝的注意事项

var a []int = []int{1, 2, 3, 4, 5}
	var slice = make([]int, 1)
	copy(slice, a)
	fmt.Println(slice)

结果:

[1]

说明,上面代码没有问题,可以运行,最后输出的是[1]

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

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

相关文章

【NLP 39、激活函数 ⑤ Swish激活函数】

我的孤独原本是座荒岛&#xff0c;直到你称成潮汐&#xff0c;原来爱是让个体失序的永恒运动 ——25.2.25 Swish激活函数是一种近年来在深度学习中广泛应用的激活函数&#xff0c;由Google Brain团队在2017年提出。其核心设计结合了Sigmoid门控机制和线性输入的乘积&#xff0c…

南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。

&#xff08;1Prompt1Story&#xff09;是一种无训练的文本到图像生成方法&#xff0c;通过整合多个提示为一个长句子&#xff0c;并结合奇异值重加权&#xff08;SVR&#xff09;和身份保持交叉注意力&#xff08;IPCA&#xff09;技术&#xff0c;解决了生成图像中身份不一致…

STM32驱动OLED屏幕全解析:从原理到温度显示实战(上) | 零基础入门STM32第五十三步

主题内容教学目的/扩展视频OLED显示屏重点课程电路原理&#xff0c;手册分析&#xff0c;驱动程序。初始化&#xff0c;清屏&#xff0c;ASCII字库&#xff0c;显示分区。调用显示函数。做带有加入图形和汉字显示的RTC时钟界面。讲字库的设计原理。 师从洋桃电子&#xff0c;杜…

MySQL语法总结

本篇博客说明&#xff1a; &#xff01;&#xff01;&#xff01;.注意此系列都用的是MySQL语句&#xff0c;和SQLServer&#xff0c;PostgreSQL有些细节上的差别&#xff01;&#xff01;&#xff01; 1.每个操作都是先展示出语法格式 2.然后是具体例子 3.本篇注脚与文本顺讯息…

从预测到控制:电力RK3568边缘计算机在电网调度中的全面应用

在智能电网的快速发展中&#xff0c;电力Ubuntu工控机&#xff08;简称“电力工控机”&#xff09;作为核心设备&#xff0c;扮演着不可或缺的角色。特别是在智能电网调度场景中&#xff0c;电力工控机的高效、稳定和智能化特性&#xff0c;为电网的稳定运行和高效管理提供了强…

day-106 统计放置房子的方式数

思路 动态规划&#xff1a;因为中间有街道隔开&#xff0c;所以只需计算一边街道的排列方式&#xff0c;最后计算平方即可 解题过程 动态转换方程&#xff1a;f[i]f[i-1]f[i-2] Code class Solution {int num 1000000007;public int countHousePlacements(int n) {int arr[…

PostgreSQL安装和mcp PostgreSQL

文章目录 一. 安装之后修改权限并登录1. 确保当前用户具有sudo权限2. 修改/etc/postgresql/<版本号>/main/pg_hba.conf配置文件为trust&#xff0c;可以免密登录3. 进行免密登录4. 添加root用户和修改postgres用户密码1. postgres用户密码2. 添加root用户3. 为root用户设…

LPZero: Language Model Zero-cost Proxy Search from Zero(未更新完预览版本)

LPZero代码 摘要 神经架构搜索 (NAS) 有助于自动执行有效的神经网络搜索&#xff0c;同时需要大量的计算资源&#xff0c;尤其是对于语言模型。零样本 NAS 利用零成本 (ZC) 代理来估计模型性能&#xff0c;从而显着降低计算需求。然而&#xff0c;现有的 ZC 代理严重依赖于深…

字典树运用

字典树运用 字典树LC208 创建字典树0-1字典树 字典树 字典树又叫 前缀树&#xff0c; 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 LC208 创建字典树 这是一个字符串字典树…

RReadWriteLock读写锁应用场景

背景 操作涉及一批数据&#xff0c;如订单&#xff0c;可能存在多个场景下操作&#xff0c;先使用读锁&#xff0c;从redis缓存中获取操作中数据 比如 关闭账单&#xff0c; 发起调账&#xff0c; 线下结算&#xff0c; 合并支付 先判断当前操作的数据&#xff0c;是否在…

0087.springboot325基于Java的企业OA管理系统的设计与实现+论文

一、系统说明 基于springbootvue的企业OA管理系统,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程。 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数…

Spring Boot 3 整合 MinIO 实现分布式文件存储

引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心&#xff0c;而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…

Redis|集群 Cluster

文章目录 是什么能干嘛集群算法-分片-槽位slotredis集群的槽位slotredis集群的分片分片槽位的优势slot槽位映射——业界的3种解决方案小厂&#xff1a;哈希取余分区中厂&#xff1a;一致性哈希算法分区大厂&#xff1a;哈希槽分区 面试题&#xff1a;为什么 Redis 集群的最大槽…

【定制开发】碰一碰发视频系统定制开发,支持OEM

在短视频营销爆发的2025年&#xff0c;"碰一碰发视频"技术已成为实体商家引流标配。某连锁餐饮品牌通过定制化开发&#xff0c;单月视频发布量突破10万条&#xff0c;获客成本降低80%&#xff01;本文将深入解析该系统的技术架构与开发要点&#xff0c;助你快速搭建高…

Linux上位机开发(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 传统的上位机开发&#xff0c;一般都是默认pc软件开发。既然是pc软件&#xff0c;一般来说都是基于windows平台开发。开放的框架&#xff0c;无非是…

算法005——有效三角形个数

力扣——有效三角形个数点击链接跳转 判断三条边是否能组成三角形&#xff0c;大家第一时间想到的就是两边之和大于第三边 但是运用这个方法&#xff0c;我们需要判断三次&#xff0c;有一个更简单的方法&#xff0c;只需要判断一次 因为 C 已经是三边之中最大的了&#xff…

【STM32】江科大STM32学习笔记汇总(已完结)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 打赏04. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【ST…

【Python编程】高性能Python Web服务部署架构解析

一、FastAPI 与 Uvicorn/Gunicorn 的协同 1. 开发环境&#xff1a;Uvicorn 直接驱动 作用&#xff1a;Uvicorn 作为 ASGI 服务器&#xff0c;原生支持 FastAPI 的异步特性&#xff0c;提供热重载&#xff08;--reload&#xff09;和高效异步请求处理。 启动命令&#xff1a; u…

OSPF的各种LSA类型,多区域及特殊区域

一、OSPF的LSA类型 OSPF&#xff08;开放最短路径优先&#xff09;协议使用多种LSA&#xff08;链路状态通告&#xff09;类型来交换网络拓扑信息。以下是主要LSA类型的详细分类及其作用&#xff1a; 1. Type 1 LSA&#xff08;路由器LSA&#xff09; 生成者&#xff1a;每个…

pyqt联合designer的运用和设置

PyQt Designer 简介 PyQt Designer 是一个用于创建和设计 PyQt 应用程序用户界面的可视化工具。它允许用户通过拖放方式添加和排列各种控件,如按钮、文本框、滑块等,并设置它们的属性和样式,从而快速构建出美观且功能完整的 UI 界面。 Windows版本:【免费】安装包别管啊啊…