小白学习go之基础篇2 -- Slice切片的原理

本文探讨Go语言中切片Slice的实现原理,包括SliceHeader结构体、初始化方式、内存分配以及切片扩容的细节。还介绍了切片使用时的常见陷阱,如切片共享、append操作及大切片性能问题。通过学习,有助于理解和高效利用切片进行开发。


前言

本文主要记录:
1.Slice切片的实现原理。
2.切片的指针是存储在堆中还是栈中的。
3.切片使用中的一些坑。


一、为什么要有切片?

由于go中的数组是值类型的,使用的时候是固定大小的 如arr := [3]int{1,2,3} 之后就无法再改变数组的长度了。
所以golang基于数组设计出了以动态数组为底层数据结构的切片Slice。动态数组就是一种可以动态往数组中添加、删除元素的数据结构,并且在容量不足的时候可以动态的进行扩容。

二、切片是怎么实现的呢?

1.Go的切片结构体 – SliceHeader

如下图所示,go使用SliceHeader这个struct来表示动态数组,它包含了一个Data 的uint类型的指针用于指向底层动态数组的地址、Len表示切片中保存的元素个数、Cap表示当前数组内总共有多少容量。

type SliceHeader struct {
   
   
	Data uintptr
	Len  int
	Cap  int
}

2.初始化切片的两种方式

切片初始化的方式分为 编译期初始化运行时初始化两种方式:
编译期初始化包括了: 1)从数组中生成切片 2)使用字面量的方式生成切片

// 演示go语言切片相关操作
// slice初始化的方式一: []string{}
slice1 := []string{
   
   "java", "golang", "python", "php"}
fmt.Println(slice1) // [java golang python php]

// slice初始化的方式二: 使用make() 函数 很常用!
slice2 := make([]string, 5)
fmt.Println(len(slice2)) // 5
fmt.Println(slice2) //[    ] 默认是5个空字符串

// slice初始化的方式三: 通过数组来创建
data_arr := [5]int{
   
   2,4,6,8,10}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值