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

    文章

    573

    浏览量

    40126
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25942
  • 切片
    +关注

    关注

    1

    文章

    22

    浏览量

    8448
收藏 人收藏

    评论

    相关推荐

    #硬声创作季 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

    PCB切片的分类及作用介绍

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

    dubbo-go 中的 TPS Limit 设计与实现

    则是 Dubbo 的 Go 语言实现。 最近在 dubbo-go 的 todo list 上发现,它还没有实现 TPS Limit 的模块,于是就抽空
    发表于 03-17 15:27 639次阅读

    中国移完成了DNN在内的完整切片以及多种智能终端切片设计实现方案

    切片白皮书》。白皮书发布旨在汇聚产业各方资源,共商提速5G切片端到端商用推进计划,早日实现5G切片规模商用,最终实现5G产业与个人消费领域、
    的头像 发表于 10-16 10:27 4156次阅读

    网络切片的分类 网络切片粒度如何选择

    网络切片是一种按需组网的方式,可以让运营商在统一的基础设施上分离出多个虚拟的端到端网络,每个网络切片从无线接入网承载网再到核心网上进行逻辑隔离,以适配各种各样类型的应用。 网络切片的分类 1、独立
    的头像 发表于 09-03 17:01 3654次阅读

    PCB电路板切片的分析

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

    Go并发模型的实现原理

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

    朋也社区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 3938次阅读

    如何实现端到端网络切片

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

    golang通过切片创建新的切片

    通过切片创建新的切片 切片之所以被称为切片,是因为创建一个新的切片,也就是把底层数组切出一部分。通过切片
    的头像 发表于 10-09 09:48 714次阅读
    golang通过<b class='flag-5'>切片</b>创建新的<b class='flag-5'>切片</b>