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 语言中非常强大和常用的数据结构之一。

相关文章
|
4月前
|
存储 Go
Golang底层原理剖析之slice类型与扩容机制
Golang底层原理剖析之slice类型与扩容机制
59 0
|
17天前
|
Go
Golang语言之切片(slice)快速入门篇
这篇文章是关于Go语言中切片(slice)的快速入门教程,详细介绍了切片的概念、定义方式、遍历、扩容机制、使用注意事项以及相关练习题。
22 5
|
11月前
|
存储 大数据 Go
100天精通Golang(基础入门篇)——第11天:深入解析Go语言中的切片(Slice)及常用函数应用
100天精通Golang(基础入门篇)——第11天:深入解析Go语言中的切片(Slice)及常用函数应用
87 0
|
4月前
|
Go
golang随笔之slice+append的陷阱
golang随笔之slice+append的陷阱
34 0
golang踩坑 1.slice传参和for range赋值
golang踩坑 1.slice传参和for range赋值
|
编译器 Go
golang slice的扩容给你整明白的
golang slice的扩容给你整明白的
|
运维 Go
学习golang(5) 初探:go 数组/slice 的基本使用
学习golang(5) 初探:go 数组/slice 的基本使用
115 0
|
存储 Java Go
【Golang之路】——slice总结
【Golang之路】——slice总结
139 0
【Golang之路】——slice总结
|
Java Go C++
Golang 笔记(三):一种理解 Slice 的模型
Golang 笔记(三):一种理解 Slice 的模型
162 0
Golang 笔记(三):一种理解 Slice 的模型