当前位置: 技术文章>> go中的切片的内部实现和基础功能详细介绍与代码示例

文章标题:go中的切片的内部实现和基础功能详细介绍与代码示例
  • 文章分类: 后端
  • 10777 阅读
文章标签: go go基础

在Go语言中,切片(slice)是对数组的一种抽象,它提供了一种动态长度的、可调整大小的数据结构。切片底层依赖于数组,并包含三个元素:指向底层数组的指针、切片的长度和切片的容量。

切片的内部实现

切片的内部结构可以表示为slice struct { array *T; len, cap int },其中array是指向底层数组的指针,len表示切片当前的长度,cap表示底层数组的容量。

当创建一个切片时,可以通过make([]T, length, capacity)函数来初始化,其中T是切片的数据类型,length是切片的长度,capacity是底层数组的容量。这个函数会分配一个底层数组,并返回一个包含指向该数组指针、长度和容量的切片。

切片的基本功能

创建切片

可以通过字面量、make()函数或者切割数组或切片来创建切片。

示例:


// 使用字面量创建切片  

var s1 = []int{1, 2, 3, 4, 5}



// 使用make()函数创建切片  

var s2 = make([]int, 5, 10)



// 切割数组或切片创建切片  

var a = []int{1, 2, 3, 4, 5}

s3 := a[1:3] // s3 := []int{2, 3}

切片的长度和容量

可以使用len()cap()函数来获取切片的长度和容量。

示例:


s := []int{1, 2, 3}

fmt.Println(len(s))   // 输出: 3  

fmt.Println(cap(s))    // 输出: 3

切片的截取和拼接

可以使用切片的截取操作符[:]来截取原切片的一部分,也可以使用append()函数来拼接两个切片。

示例:


s1 := []int{1, 2, 3}

s2 := []int{4, 5, 6}

s3 := s1[:2]   // s3 := []int{1, 2}  

s4 := append(s1, s2...)   // s4 := []int{1, 2, 4, 5, 6}

切片的切割和扩展

可以使用切片的切割操作符[low:high]来切割原切片的一部分,也可以使用copy()函数来扩展原切片的容量并赋值给新的切片。

示例:


s := []int{1, 2, 3, 4, 5}

s1 := s[1:3]   // s1 := []int{2, 3}  

s2 := make([]int, 3)

copy(s2, s[:2])   // s2 := []int{1, 2},原切片s的前两个元素被复制到新切片s2中。


推荐文章