Go slice 用法及数据结构详解

本文详细介绍了Go语言中切片(slice)的数据结构、初始化方法、切片操作、append函数的工作原理、copy函数的使用以及切片表达式。通过实例展示了切片在内存管理、数组和字符串切片、扩容策略等方面的特点,帮助读者深入理解Go语言切片的使用和内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

slice数据结构

array指针指向底层数组,len表示切片长度,cap表示底层数组容量

type slice struct {
	array unsafe.Pointer	//切片底层数组的起始位置
	len int             	//切片长度
	cap int					//切片容量
}

slice初始化的方法

  1. 变量声明(与所有类型变量一样,变量声明后变量值为0,对于切片来讲,0值为nil)
  2. 字面量(声明长度为0的切片时推荐使用变量声明的方式获得一个nil切片,因为nil切片不需要分配内存)
  3. 内置函数make() (切片元素均初始化为相应类型的零值)
  4. 适用于任意类型的内置函数new()(此时创建的切片值为nil)
var s []int//变量声明 nil切片,不需要分配内存
s1 := []int{}//长度为0的切片,空切片,指长度为空,其值并不是nil
s2 := []int{1,2,3}//长度为3的切片
fmt.Println(s)   //[]
fmt.Println(s1)  //[]
fmt.Println(s2)  //[1 2 3]
fmt.Println(s==nil) //true
fmt.Println(s1==nil) //false

s3 := make([]int, 12) //指定长度
s4 := make([]int, 10, 100) //推荐指定长度和预估空间,可以有效减小切片扩容时内存分配及拷贝次数
fmt.Println(s3)  //[0 0 0 0 0 0 0 0 0 0 0 0]
fmt.Println(s4)  //[0 0 0 0 0 0 0 0 0 0]

slice := *new([]int)
fmt.Println(slice)  //[]
fmt.Println(slice==nil) //true

slice切取

  1. 切片可以基于数组和切片创建,切片与原数组或切片共享底层空间,修改切片会影响原数组或切片
  2. 切片表达式[low : high]表示的是左闭右开的区间[low, high),切取的长度为high-low
array := [5]int{1,2,3,4,5}
s5 := array[0:2] //从数组中切取
s6 := s5[0:1]    //从切片中切取
fmt.Println(s5)  //[1 2]
fmt.Println(s6)  //[1]

append()

当切片空间不足时&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值