0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Go切片的内部实现

麦辣鸡腿堡 来源:盼盼编程 作者:盼盼编程 2023-10-09 09:43 次阅读

切片

Go中提供了一种灵活,功能强悍的内置类型Slices切片(“动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

切片中有两个概念:一是len长度,二是cap容量,长度是指已经被赋过值的最大下标+1,可通过内置函数len()获得。

容量是指切片目前可容纳的最多元素个数,可通过内置函数cap()获得。切片是引用类型,因此在当传递切片时将引用同一指针,修改值将会影响其他的对象。

s := []int {1,2,3 }            //直接初始化切片

s := arr[:]                    //用数组初始化切片

s = make([]int, 3)             //make初始化,有3个元素的切片, len和cap都为3

s = make([]int, 2, 3)          //make初始化,有2个元素的切片, len为2, cap为3

a = append(a, 1)               // 追加1个元素

a = append(a, 1, 2, 3)         // 追加多个元素, 手写解包方式

a = append(a, []int{1,2,3}...) // 追加一个切片, 切片需要解包

不过要注意的是,在容量不足的情况下,append的操作会导致重新分配内存,可能导致巨大的内存分配和复制数据代价。

a = append([]int{0}, a...) 切片头部添加元素。在开头一般都会导致内存的重新分配,而且会导致已有的元素全部复制1次。

因此,从切片的开头添加元素的性能一般要比从尾部追加元素的性能差很多。

//切片是地址传递
func updateSlice(a []int) {
     a[0] = 3
}

func main() {
     //切片
     var a = []int{1, 2, 3}
     c := make([]int, 5)
     copy(c, a)

     updateSlice(c)
     fmt.Println(c)
}
打印
[3 2 3 0 0]

切片的内部实现

切片是一个很小的对象,它对底层的数组(内部是通过数组保存数据的)进行了抽象,并提供相关的操作方法。

切片是一个有三个字段的数据结构,这些数据结构包含 Golang 需要操作底层数组的元数据:

图片

这 3 个字段分别是指向底层数组的指针、切片访问的元素的个数(即长度)和切片允许增长到的元素个数(即容量)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39900
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595
  • 切片
    +关注

    关注

    1

    文章

    22

    浏览量

    8414
收藏 人收藏

    评论

    相关推荐

    #硬声创作季 Go核心编程_使用切片的区别分析

    编程语言go语言
    Mr_haohao
    发布于 :2022年09月11日 18:05:54

    请问BGA封装如何切片

    请问BGA封装如何切片?是带芯片一起切片用显微镜观察锡球情况吗?是否有自动切片,精度如何?有看到板厂给的异常板切片报告说手工切片具有不确定性
    发表于 12-04 22:06

    怎么获得不同FPGA系列的等效切片计数

    大家好,我在Artix-7设备上实现了一个图像处理系统。我通过使用ISE工具生成的发布位置和路径报告,根据占用的切片计算了设计的资源消耗。现在我需要将我设计的资源消耗(占用切片)与其他一些设计进行
    发表于 04-29 13:40

    如何实现一个使用V5上至少80%可用切片的设计

    你好,我必须实现一个使用V5上至少80%可用切片的设计。实现它的最佳方法是什么?是否有可用的示例设计使用80%或更多的逻辑?切片数量切片LU
    发表于 06-17 14:22

    芯片漏电点FIB切片分析

    失效分析,很多时候都需要做FIB-SEM测试,相信各位电子行业的朋友并不陌生, 大家都知道用聚焦离子束FIB切片芯片,解剖芯片内部结构 查找芯片失效点分析,再做进一步分析。今天,邵工给大家分享一下
    发表于 08-05 12:11

    晶柱切片後處理

    晶柱切片後處理 矽晶柱長成後,整個晶圓的製作才到了一半,接下必須將晶柱做裁切與檢測,裁切掉頭尾的晶棒將會進行外徑研磨、切片
    发表于 10-27 15:40 1313次阅读

    5G网络切片什么鬼?怎么实现端到端网络切片

    当5G被广泛提及的时候,网络切片是其中讨论最多的技术。像KT、SK Telecom、China Mobile、DT、KDDI、NTT等网络运营商,以及Ericsson、Nokia 、Huawei 等设备商都认为网络切片是5G时代的理想网络架构。
    发表于 11-29 08:27 2.3w次阅读
    5G网络<b class='flag-5'>切片</b>什么鬼?怎么<b class='flag-5'>实现</b>端到端网络<b class='flag-5'>切片</b>?

    PCB切片的分类及作用介绍

    切片分析主要用于检查PCB内部走线厚度、层数,通孔孔径大小,通孔质量观察,用于检查PCBA焊点内部空洞,界面结合状况,润湿质量评价等等。切片分析是进行PCB/PCBA失效分析的重要技术
    的头像 发表于 05-17 14:53 9795次阅读

    三大巨头实现首个基于APP应用级的5G SA端到端网络切片

    近日,中兴通讯携手中国联通、腾讯在广东实现业内首个基于APP应用级的5G SA端到端网络切片,构建包含5G SA网络、切片运营平台、5G终端和手机APP应用等端到端切片解决方案。
    发表于 08-14 16:54 809次阅读

    PCB电路板切片的分析

    目的:  电路板品质的好坏、问题的发生与解决、制程改进的评估,在都需要切片做为客观检查、研究与判断的根据。切片质量的好坏,对结果的判定影响很大。  切片分析主要用于检查PCB内部走线厚
    发表于 10-19 15:28 8453次阅读
    PCB电路板<b class='flag-5'>切片</b>的分析

    详细介绍go语言中的闭包的实现

    ,没有研究过函数式语言的用户可能很难理解闭包的强大,相关的概念超出了本书的范围。Go语言是支持闭包的,这里只是简单地讲一下在Go语言中闭包是如何实现的。 func f(i int) func() int
    的头像 发表于 10-20 16:18 1683次阅读

    Go并发模型的实现原理

    Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。
    的头像 发表于 04-15 08:49 1059次阅读

    朋也社区Go版本Go实现的社区系统

    ./oschina_soft/pybbs-go.zip
    发表于 06-10 14:32 0次下载
    朋也社区<b class='flag-5'>Go</b>版本<b class='flag-5'>Go</b><b class='flag-5'>实现</b>的社区系统

    5G 网络切片之OTN切片和FlexE切片区别

    5G 网络切片本质上是一个 E2E 概念,将用户设备连接到租户特定的应用程序。E2E 网络切片由RAN 切片、核心切片和传输切片组成。每个网
    发表于 01-04 11:56 2608次阅读

    如何实现端到端网络切片

    3GPP将网络切片定义为5G 网络的主要功能之一,网络切片可看作是动态创建的逻辑端到端网络。在深入研究网络切片的概念之前,我们先简单回顾下 5G 的三大应用场景。
    发表于 06-15 17:56 1180次阅读
    如何<b class='flag-5'>实现</b>端到端网络<b class='flag-5'>切片</b>?