GOLANG SLICE 的底层实现

简介: GOLANG SLICE 的底层实现

在 Go 语言中,slice 是一个引用类型,它底层由三个部分组成:

  1. 指针(pointer): 指向底层数组的起始位置。
  2. 长度(length): 当前 slice 中元素的数量。
  3. 容量(capacity): 底层数组的总容量。

我们可以用下面的结构体来表示 slice 的内部实现:

type slice struct {
   
    array unsafe.Pointer
    len   int
    cap   int
}

slice 的底层实现机制如下:

  1. 创建 slice:

    • 使用 make([]T, len, cap) 或字面量 []T{...} 创建 slice。
    • 初始化 slice 结构体的三个字段: 指针指向底层数组起始位置,长度和容量设置为指定值。
  2. 访问元素:

    • 通过索引访问 slice 中的元素时,Go 运行时会计算元素在底层数组中的位置,然后返回该元素的值。
  3. append 操作:

    • 当 slice 容量不足时,Go 运行时会分配一个更大的底层数组,并将原数组的元素拷贝到新数组中。
    • 然后更新 slice 结构体的三个字段:指针指向新数组,长度和容量更新为新值。
  4. 切片操作:

    • 创建新 slice 时,Go 只会更新 slice 结构体的指针、长度和容量字段,而不会拷贝底层数组。
    • 新 slice 和原 slice 共享底层数组,这就是 slice 的"视图"特性。
  5. 内存管理:

    • 当 slice 的最后一个引用被释放时,Go 垃圾收集器会自动回收底层数组占用的内存。

总之,Go 的 slice 实现非常高效和灵活。通过动态调整底层数组的容量,slice 可以自动扩展,满足程序的需求。同时,slice 的"视图"特性也使得切片操作非常方便和高效。这些特性使 slice 成为 Go 语言中非常强大和常用的数据结构之一。

相关文章
|
1月前
|
存储 Go
Golang底层原理剖析之slice类型与扩容机制
Golang底层原理剖析之slice类型与扩容机制
31 0
|
8月前
|
存储 大数据 Go
100天精通Golang(基础入门篇)——第11天:深入解析Go语言中的切片(Slice)及常用函数应用
100天精通Golang(基础入门篇)——第11天:深入解析Go语言中的切片(Slice)及常用函数应用
76 0
|
1月前
|
Go
golang随笔之slice+append的陷阱
golang随笔之slice+append的陷阱
24 0
|
11月前
|
存储 Go
golang踩坑 1.slice传参和for range赋值
golang踩坑 1.slice传参和for range赋值
|
11月前
|
编译器 Go
golang slice的扩容给你整明白的
golang slice的扩容给你整明白的
|
运维 Go
学习golang(5) 初探:go 数组/slice 的基本使用
学习golang(5) 初探:go 数组/slice 的基本使用
101 0
|
存储 Java Go
【Golang之路】——slice总结
【Golang之路】——slice总结
131 0
【Golang之路】——slice总结
|
Java Go C++
Golang 笔记(三):一种理解 Slice 的模型
Golang 笔记(三):一种理解 Slice 的模型
147 0
Golang 笔记(三):一种理解 Slice 的模型
|
JSON 小程序 前端开发
Golang slice的几种用法
最近生活风平浪静。工作时间还是比较忙,业余时间写文章的频率不高,本来想把关于slice的都写完,但后来发现太多了,于是打算拆成三篇来写。 前段时间花了大量的时间在弄小程序,本来都发布成功了,但后来某一次小程序升级说涉及交友服务,需要改类目,而交友类目需要电信增值服务的证,这个证比较难搞,所以可能后面打算终止这个小程序了,过段时间可能会把代码开源吧。
713 0