当前位置: 首页 > news >正文

29-Golang中的切片

Golang中的切片

    • 基本介绍
    • 切片在内存中的形式
    • 切片使用的三种方式
      • 方式一:
      • 方式二:
      • 方式三:
      • 切片使用的区别
    • 切片的遍历
    • 切片注意事项和细节说明
      • append函数
      • 切片的拷贝操作
    • string和slice

基本介绍

  • 1.切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制
  • 2.切片的使用和数组类型,遍历切片、访问切片的元素和求切片长度len(slice)都是一样
  • 3.切片的长度是可以变化的,因此切片是一个可以动态变化数组
  • 4.切片定义的基本语法:
    • var 变量名 [] 类型, 比如: bar a [] int
package main
import ("fmt")func main() {var intArr [5]int = [...]int{1, 33, 22, 55, 66}//slice就是切片名//intArr[1:3]表示slice引用到intArr这个数组//引用intArr数组的起始下标为1, 最后的下标为3(但是不包含3)slice := intArr[1:3]fmt.Println("intArr=", intArr)fmt.Println("slice 的元素是:", slice)fmt.Println("slice 的元素个数是:", len(slice))fmt.Println("slice 的容量", cap(slice)) //切片的容量是可以动态变化的 }
/*
intArr= [1 33 22 55 66]
slice 的元素是: [33 22]
slice 的元素个数是: 2
slice 的容量 4
*/

切片在内存中的形式

  • 切片底层的数据结构可以理解成是一个结构体struct
  • 切片确实是一个引用类型
    在这里插入图片描述

切片使用的三种方式

方式一:

定义一个切片,然后让切片去引用一个已经创建好的数组,前面的案例就是这样的

方式二:

通过make来创建切片

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

package main
import ("fmt")func main() {var slice []int = make([]int, 4, 10)fmt.Println(slice) //默认值为0fmt.Println("slice len=", len(slice), "slice cap=", cap(slice))slice[0] = 100slice[2] = 200fmt.Println(slice)
}
/*
[0 0 0 0]
slice len= 4 slice cap= 10
[100 0 200 0] 
*/

总结:

  • 1.通过make方式创建切片可以指定切片的大小和容量
  • 2.如果没有给切片的各个元素赋值,那么就会使用默认值
  • 3.通过make方式创建的切片对应的数组的有make底层维护,对外不可见,只能通过slice去访问各个元素

方式三:

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

func main(){var slice []int = []int {1, 3, 5}fmt.Println(slice)
}

切片使用的区别

  • 方式一是直接引用数组,这个数组是事先存在的,程序员可见的
  • 方式二是通过make来创建切片,make也会创建一个数组,是有切片在底层进行维护,程序员是看不见的

切片的遍历

package main
import ("fmt")func main() {//使用常规的for循环遍历切片var arr [5]int = [...]int{4, 5, 6, 7, 8}slice := arr[1:4]for i :=0; i < len(slice); i++ {fmt.Printf("slice[%v]=%v ", i, slice[i])}fmt.Println()//使用for-range方式切片for i, v := range slice {fmt.Printf("i=%v v=%v ", i, v)}
}//slice[0]=5 slice[1]=6 slice[2]=7 
//i=0 v=5 i=1 v=6 i=2 v=7

切片注意事项和细节说明

  • 切片初始化时 var slice = arr[startindex:endindex]
    • 说明:从arr数组下标为startindex,取到endindex的元素(不含arr[endindex])
  • 切片初始化时,任然不可以越界。范围在[0-len(arr)之间],但是可以动态增长
    • var slice = arr [0:end]可以简写:var slice = arr [:end]
    • var slice = arr[start:len(arr)]可以简写:var slice = arr[start:]
    • var slice = arr[0:len(arr)]可以简写:var slice = arr[:]
  • cap是一个内置函数,用于统计切片的容量,即最大可以存放多少个元素
  • 切片定义完后,还不能使用,因为本省是一个空的,需要让其引用到一个数组,或者make一个空间供切片来使用
  • 切片可以继续切片

append函数

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

package main
import ("fmt")func main() {var slice []int = []int{100, 200, 300}//通过append直接给slice追加具体的元素slice = append(slice, 400, 5000)fmt.Println("slice", slice)//通过append将切片slice追加给sliceslice = append(slice, slice...)fmt.Println("slice", slice)
}
/*
slice [100 200 300 400 5000]
slice [100 200 300 400 5000 100 200 300 400 5000]
*/

底层原理分析

1.切片append操作的本质就是对数组扩容

2.go底层会创建一下新的数组newArr(安装扩容后大小)

3.将slice原来包含的元素拷贝到新的数组newArr

4.slice重新引用到newArr

5.注意newArr是在底层来维护的,程序员不可见
在这里插入图片描述

切片的拷贝操作

copy(para1,para2)参数的数据类型是切片

由下面的案例可知,slice1和slice2的数据空间是独立,相互不影响,也就是说slice[0]=999,slice2[0]任是1

package main
import ("fmt")func main() {var slice1 []int = []int{1, 2, 3, 4, 5}var slice2 = make([]int, 10)copy(slice2, slice1)fmt.Println("slice1", slice1)fmt.Println("slice2", slice2)
}/*
slice1 [1 2 3 4 5]
slice2 [1 2 3 4 5 0 0 0 0 0]
*/

string和slice

  • slice底层是一个byte数组,因此string也可以进行切片处理
  • sting是不可变的,也就是说不能通过str[0]='z’方式来修改字符串
  • 如果需要修改字符串,可以先将string->[]byte/或者[]rune->修改->重写转成string
package main
import ("fmt")func main() {str := "hello@wings"//使用切片获取内容slice := str[6:]fmt.Println("slice=", slice)//[]byte可以处理英文和数字但是不能处理中文//[]rune是按照字符处理,兼容汉字arr1 := []byte(str)arr1[0] = 'z'str = string(arr1)fmt.Println("str=", str)
}//slice= wings
//str=zhello@wings

在这里插入图片描述

相关文章:

29-Golang中的切片

Golang中的切片基本介绍切片在内存中的形式切片使用的三种方式方式一&#xff1a;方式二&#xff1a;方式三&#xff1a;切片使用的区别切片的遍历切片注意事项和细节说明append函数切片的拷贝操作string和slice基本介绍 1.切片是数组的一个引用&#xff0c;因此切片是引用类型…...

闲聊一下开源

今天看了下中国开源开发者报告&#xff0c;感觉收货不少&#xff0c;针对里面的内容&#xff0c;我也加入一些自己的理解&#xff0c;写下来和大家一起闲聊一下。 AI 时至今日&#xff0c;我说一句AI已经在我国几乎各个行业都能找到应用&#xff0c;应该没人反对吧&#xff1…...

用这4招优雅的实现Spring Boot 异步线程间数据传递

Spring Boot 自定义线程池实现异步开发相信大家都了解&#xff0c;但是在实际开发中需要在父子线程之间传递一些数据&#xff0c;比如用户信息&#xff0c;链路信息等等 比如用户登录信息使用ThreadLocal存放保证线程隔离&#xff0c;代码如下&#xff1a; /*** author 公众号…...

RocketMQ源码分析之NameServer

1、RocketMQ组件概述 NameServer NameServer相当于配置中心&#xff0c;维护Broker集群、Broker信息、Broker存活信息、主题与队列信息等。NameServer彼此之间不通信&#xff0c;每个Broker与集群内所有的Nameserver保持长连接。 2、源码分析NameServer 本文不对 NameServer 与…...

如何优化认知配比

战略可以归结为三种要素的合理配比。我们对战略的一个定义是&#xff1a;在终局处的判断。这其实来自于一个宗教的命题——面死而生。死是终局&#xff0c;生是过程&#xff0c;当你想做一个思想实验&#xff0c;或者是你真的有缘能够直面死亡&#xff0c;你所有关于生的认知就…...

WuThreat身份安全云-TVD每日漏洞情报-2023-02-15

漏洞名称:TOTOLINK A7100RU 安全漏洞 漏洞级别:严重 漏洞编号:CVE-2023-24276,CNNVD-202302-367 相关涉及:TOTOlink A7100RU(V7.4cu.2313_B20191024)路由器 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-02977 漏洞名称:Windows NTLM 特权提…...

Unreal Engine角色涌现行为开发教程

在本文中&#xff0c;我将讨论如何使用虚幻引擎、强化学习和免费的机器学习插件 MindMaker 在 AI 角色中生成涌现行为。 目的是感兴趣的读者可以使用它作为在他们自己的游戏项目或具体的 AI 角色中创建涌现行为的指南。 推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。…...

vue处理一千张图片进行分页加载

vue处理一千张图片进行分页加载 开发过程中&#xff0c;如果后端一次性返回你1000多条图片或数据&#xff0c;那我们前端应该怎么用什么思路去更好的渲染呢&#xff1f; 第一种&#xff1a;我们可以使用分页加载 第二种&#xff1a;我们可以进行懒加载那我们用第一种方法使用…...

(三十三)Vue之消息订阅与发布

文章目录消息订阅与发布理解使用步骤改造TodoList为消息订阅与发布上一篇&#xff1a;&#xff08;三十二&#xff09;Vue之全局事件总线 消息订阅与发布 理解 这种方式的思想与全局事件总线很相似&#xff0c;一种组件间通信的方式&#xff0c;适用于任意组件间通信。 它包…...

Http中你必须知道那点事

1, HTTP 1.1 简介 HTTP概念 HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 数据传输的规则指的是请求数据和响应数据需要按照指定的格式进行传输。如果想知道具体的格式&#xff0c;可以打开浏览器&#xf…...

ViewBinding使用入门

ViewBinding 参考资料: 新技术 ViewBinding 最佳实践 & 原理击穿 更多 ViewBinding 的封装思路 1. kotlin-android-extensions(KAE) 的问题 根据Google官方的说法, KAE存在以下问题: 污染全局命名空间不能暴露可空性信息仅支持Kotlin代码 kotlin在1.4.20中 开始废弃这…...

Retrofit源码分析实践(七)【Retrofit ConvertFactory的功能实现】

Retrofit源码分析&实践系列文章目录 Retrofit源码分析&实践(一)【从使用入手分析源码】Retrofit源码分析&实践(二)【Retrofit 免费的api测试工具引入】Retrofit源码分析&实践(三)【Retrofit 代码框架搭建】Retrofit源码分析&实践(四)【Retrofit 实…...

介电常数常用测量方法综述

张扬1&#xff0c;徐尚志1&#xff0c;赵文晖2&#xff0c;龚增2&#xff0c;赵晓群1 1同济大学&#xff0c;上海 2上海市计量测试技术研究院&#xff0c;上海 在设计电路、天线、电容器等过程中经常会涉及所用材料的介电常数, 所以深入了解介电常数的相关概念对实际工作有重…...

重生之我是赏金猎人(三)-SRC漏洞挖掘-强行多次FUZZ发现某厂商SSRF到redis密码喷洒批量反弹Shell

0x00 前言 https://github.com/J0o1ey/BountyHunterInChina 欢迎大佬们点个star 最近BugBounty挖了不少&#xff0c;但大多数都是有手就行的漏洞&#xff0c;需要动脑子的实属罕见 而今天就遇到了一个非常好的案例&#xff0c;故作此文 0x01 对目录批量FUZZ&#xff0c;发…...

学会分享,学会生活,分享5款简单易用的软件。

分享是一种博爱的心境&#xff0c;学会分享&#xff0c;就学会了生活。 1.在线图片编辑工具——佐糖 佐糖是一款在线免费图片编辑工具&#xff0c;采用AI人工智能技术&#xff0c;自动识别图片&#xff0c;支持一键抠图&#xff0c;更换背景&#xff0c;移除水印等。另外还提…...

Redux 与 Vuex 的区别总结

Redux 工作流程 首先,用户(通过 view)发送 Action,发送方式就用到了 dispatch 方法。然后,Store 自动调用 Reducer,并传入俩个参数,当前 State 和 收到的 Action。而 Reducer 会返回新的 State。最后,Store 根据接收到的 State,判断是否发生变化。一旦发生变化,Store…...

QT(15)- QFile

1 函数 1.1 copy bool QFile::copy(const QString &newName) QFile::copy(const QString &newName) 是 Qt 中用于复制文件的函数&#xff0c;将 fileName() 所指向的文件复制到 newName 指定的新位置。 在复制文件之前&#xff0c;源文件会先被关闭。如果被复制的文…...

GaiaX开源解读 | 表达式作为逻辑动态化的基础,我们是如何设计的

GaiaX跨端模板引擎&#xff0c;是在阿里优酷、淘票票、大麦内广泛使用的Native动态化方案&#xff0c;其核心优势是性能、稳定和易用。本系列文章《GaiaX开源解读》&#xff0c;带大家看看过去三年GaiaX的发展过程。 前言 GaiaX【https://github.com/alibaba/GaiaX】是由优酷应…...

python中adb shell相关操作

1、python 实现adb交互&#xff0c;进入adb shell后&#xff0c;如何再发送消息 os.popen("adb -s 192.168.1.100:5555 shell \"dmesg > /data/dmesg.log\"")进入进入adb shell&#xff0c;在执行 dmesg > /data/dmesg.log 2、python(或BAT脚本)自…...

python 之 资源使用与控制 resource模块

一、背景 2021年做可信计算时&#xff0c;由于甲方给的CPU利用率不能不能超过20%&#xff1b; 目的&#xff1a;我们的程序部署甲方服务器上不能阻碍其甲方服务的正常运行 我们的程序在CPU超过20%时&#xff0c;可以休眠几秒后继续运行 此时需要检测控制服务器的CPU资源使用信…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...