go切片定义和初始化

1.简介

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

2.切片的定义基本语法

var 切片名 []类型

比如:var a []int

3.切片的初始化

3.1方式一

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

    var arr = [...]int{1, 2, 3, 4, 5, 6}slice := arr[1:3]slice[0] = 100fmt.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] = 1fmt.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 []intsliceB[0] = 2 //golang中没办法通过下标方式给切片扩容,需要用到append()方法.

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

    var sliceB []intsliceB = 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 := sliceAvar 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.mzph.cn/bicheng/72675.shtml

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

相关文章

游戏引擎学习第138天

仓库:https://gitee.com/mrxiao_com/2d_game_3 资产&#xff1a;game_hero_test_assets_003.zip 发布 我们的目标是展示游戏运行时的完整过程&#xff0c;从像素渲染到不使用GPU的方式&#xff0c;我们自己编写了渲染器并完成了所有的工作。今天我们开始了一些新的内容&#…

毕业项目推荐:基于yolov8/yolov5/yolo11的暴力行为检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

docker中kibana启动后,通过浏览器访问,出现server is not ready yet

问题&#xff1a;当我在浏览器访问kibana时&#xff0c;浏览器给我报了server is not ready yet. 在网上试了很多方法&#xff0c;都未能解决&#xff0c;下面是我的方法&#xff1a; 查看kibana日志&#xff1a; docker logs -f kibana从控制台打印的日志可以发现&#xff…

在 Docker 中,无法直接将外部多个端口映射到容器内部的同一个端口

Docker 的端口映射是一对一的&#xff0c;即一个外部端口只能映射到容器内部的一个端口。 1. 为什么不能多对一映射&#xff1f; 端口冲突&#xff1a; 如果外部多个端口映射到容器内部的同一个端口&#xff0c;Docker 无法区分外部请求应该转发到哪个内部端口&#xff0c;会…

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…

C++中的.h文件一般是干什么的?

在C中&#xff0c;.h 文件通常是 头文件&#xff08;Header File&#xff09;&#xff0c;它们的主要作用是声明类、函数、常量、宏以及其他在多个源文件&#xff08;.cpp文件&#xff09;之间共享的元素。头文件提供了一个接口&#xff0c;使得不同的源文件能够访问这些共享的…

基础算法总结

基础算法总结 1、模拟1.1 什么是模拟算法1.2 算法题1.2.1 多项式输出1.2.2 蛇形方阵 2 高精度算法2.1 什么是高精度算法2.2 算法题2.2.1 高精度加法 2.2.2 高精度乘法 3 普通枚举3.1 算法题3.1.1 铺地毯 3.1.2 回文日期 4 前缀和算法4.1 什么是前缀和4.2 算法题4.2.1 最大子段和…

密码学(哈希函数)

4.1 Hash函数与数据完整性 数据完整性&#xff1a; 检测传输消息&#xff08;加密或未加密&#xff09;的修改。 密码学Hash函数&#xff1a; 构建某些数据的简短“指纹”&#xff1b;如果数据被篡改&#xff0c;则该指纹&#xff08;以高概率&#xff09;不再有效。Hash函数…

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…

Linux:文件描述符与重定向

目录 一、文件描述符 1.文件内核对象 2.文件描述符分配原则 二、文件重定向 1.重定向的现象 输出重定向 输入重定向 dup2 2.重定向的使用 三、标准输出和标准错误 继上篇文章中&#xff0c;我们了解了fd打印的值为文件描述符&#xff0c;那么它还有什么作用呢&…

白盒测试(3):PCB阻抗测试方法

PCB阻抗测试是确保信号完整性的关键&#xff0c;通过测量走线的特性阻抗&#xff0c;验证其是否符合设计目标。常用方法包括时域反射法&#xff08;TDR&#xff09;、网络分析仪法和仿真软件法。TDR通过分析反射信号定位阻抗异常&#xff0c;网络分析仪通过S参数计算阻抗&#…

CentOS 7 安装Nginx-1.26.3

无论安装啥工具、首先认准了就是官网。Nginx Nginx官网下载安装包 Windows下载&#xff1a; http://nginx.org/download/nginx-1.26.3.zipLinxu下载 wget http://nginx.org/download/nginx-1.26.3.tar.gzLinux安装Nginx-1.26.3 安装之前先安装Nginx依赖包、自行选择 yum -y i…

笔记:如何使用XAML Styler以及在不同的开发环境中使用一致

一、目的&#xff1a;分享如何使用XAML Styler以及在不同的开发环境中使用一致 XAML Styler 是一个 Visual Studio 扩展&#xff0c;用于自动格式化和整理 XAML 文件。它可以帮助开发者保持一致的代码风格&#xff0c;提高代码的可读性和可维护性。以下是如何在 Visual Studio …

分布式存储学习——HBase概述

1.1 HBase概述 1.1.1 理解大数据背景 1.1.2 HBase是什么 1.1.3 HBase与Hadoop的关系 1.1.4 HBase的核心功能模块 1.1.5 HBase的应用场景和经典案例 1.1.6 小结 本文参考于学校《HBase应用于开发》教材 1.1 HBase概述 本节将介绍大数据背景和HBase的基本概念&#xff0c…

交叉编译openssl及curl

操作环境&#xff1a;Ubuntu20.04 IDE工具&#xff1a;Clion2020.2 curl下载地址&#xff1a;https://curl.se/download/ openssl下载地址&#xff1a;https://openssl-library.org/source/old/index.html 直接交叉编译curl会报错找不到openssl&#xff0c;所以需要先交叉编…

MDM 如何彻底改变医疗设备的远程管理

在现代医疗行业迅速发展的格局中&#xff0c;医院和诊所越来越依赖诸如医疗平板和移动工作站等移动设备。这些设备在提高工作效率和提供卓越的患者护理方面发挥着关键作用。然而&#xff0c;随着它们的广泛使用&#xff0c;也带来了一系列挑战&#xff0c;例如在不同地点确保数…

零基础C语言学习日志22(自定义类型:联合和枚举)

目录 联合体 联合体类型的声明 联合体的特点 相同成员联合体和结构体的对比 联合体大小的计算 例子 枚举类型 枚举类型的声明 枚举类型的优点 枚举类型的使用 联合体 联合体类型的声明 像结构体一样&#xff0c;联合体也是由一个或者多个成员构成&#xff0c;这些成…

天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】

大模型风险与不当用例——价值观错位 大模型与人类价值观、期望之间的不一致而导致的安全问题&#xff0c;包含&#xff1a;• 社会偏见&#xff08;Social Bias&#xff09;LLM在生成文本时强化对特定社会群体的刻板印象&#xff0c;例如将穆斯林与恐怖主义关联&#xff0c;或…

[C语言日寄] 字符串操作函数的使用及其拓展

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

Qt 进度条与多线程应用、基于 Qt 的文件复制工具开发

练习1&#xff1a;Qt 进度条与多线程应用 题目描述 开发一个基于 Qt 的应用程序&#xff0c;该应用程序包含一个水平进度条&#xff08;QSlider&#xff09;&#xff0c;并且需要通过多线程来更新进度条的值。请根据以下要求完成代码&#xff1a; 界面设计&#xff1a; 使用 QS…