【图】图解go切片|Go主题月

简介: 切片(Slice)是go提供的一种便捷操作数组的数据结构。可以按需自动增长和缩小数组,切片通过append函数来动态添加底层数组数据。因为切片的底层是数组,所以在内存中是在连续内存块中分配内存的,所以切片可以和数组一样获得索引,迭代以及垃圾回收优化等好处。

说明


切片(Slice)go提供的一种便捷操作数组的数据结构。可以按需自动增长和缩小数组,切片通过append函数来动态添加底层数组数据。因为切片的底层是数组,所以在内存中是在连续内存块中分配内存的,所以切片可以和数组一样获得索引,迭代以及垃圾回收优化等好处。

声明切片


make声明切片

// 声明切片 容量为4  类型int初始化默认值为0
slice:=make([]int,4)
fmt.Println(slice)
// 输出
[0 0 0 0]

网络异常,图片无法展示
|

切片字面量

如果在[]运算符里指定了一个值,那么创建的就不是切片,而是数组。只有不指定值的时候才会创建切片

// 创建一个容量为4的切片,并赋初始值
slice:=[]int{1,2,3,4}
fmt.Println(slice)
// 输出
[1 2 3 4]

网络异常,图片无法展示
|

nil切片

// 声明nil切片  此时不会初始化默认值
var slice []int
fmt.Println(slice)
// 输出
[]

空切片

// 空切片 没有初始化默认值
slice:=[]int{}
fmt.Println(slice)
// 输出
[]

网络异常,图片无法展示
|

两个切片共用一个底层数据

修改数据操作

  • 声明两个切片共用一个底层数组

slice2 := slice[1:3]可以看成slice2 := slice[x:y],因为slice底层数组容量为4,

所以slice2的长度为:y-x(3-1=2)。容量为:4-x(4-1=3)

slice := []int{1,2,3,4}
slice2 := slice[1:3]
fmt.Println(slice)
fmt.Println(slice2)
// 输出
[1 2 3 4]
[2 3]

网络异常,图片无法展示
|

  • 修改slice2切片的数据

同时也修改了slice的值

slice2[1] = 99
fmt.Println(slice)
fmt.Println(slice2)
// 输出
[1 2 99 4]
[2 99]
  • 网络异常,图片无法展示
    |

添加数据操作

在上面数据基础上添加一个数据到slice2

同时会修改slice的值,因为底层数组是同一个

slice2 = append(slice2,66)
fmt.Println(slice)
fmt.Println(slice2)
// 输出
[1 2 99 66]
[2 99 66]

网络异常,图片无法展示
|

### 使添加操作不影响原切片

解决这个问题就是在赋值时使用切片字面量的第三个参数

**slice2 := slice[1:2:2] 可以看成slice2 := slice[x:y:z] **因为slice底层数组容量为4,

所以slice2的长度为:y-x(2-1=1), slice2的容量为:z-x(2-1=1)

slice := []int{1,2,3,4}
//slice2 := slice[1:3]
// 设置限制容量为2-1=1 
slice2 := slice[1:2:2]
// 添加参数slice2将进行扩容 扩容到原来的2倍
slice2 = append(slice2,66)
fmt.Println(slice)
fmt.Println(slice2)
// 输出
[1 2 3 4]
[2 66]

网络异常,图片无法展示
|

扩容

在切片容量小于1000个元素时,总是会成倍地增加容量,一旦元素超过1000,容量的增长因子会设为1.25,也就是会每次增加25%的容量。随着go不断的迭代更新,这种增长算法可能会有所改变。

slice := []int{1,2,3,4}
fmt.Printf("扩容前容量:%d\n",cap(slice))
fmt.Println("内容:",slice)
fmt.Println("------------------------")
slice = append(slice,88)
fmt.Printf("扩容后容量:%d\n",cap(slice))
fmt.Println("内容:",slice)
// 输出
扩容前容量:4
内容: [1 2 3 4]
------------------------
扩容后容量:8
内容: [1 2 3 4 88]

网络异常,图片无法展示
|


目录
相关文章
|
4月前
|
Go
Go 中使用切片来实现动态数组的功能
Go 中使用切片来实现动态数组的功能
|
4月前
|
存储 监控 Go
【Go语言精进之路】构建高效Go程序:了解切片实现原理并高效使用
【Go语言精进之路】构建高效Go程序:了解切片实现原理并高效使用
62 3
|
4月前
|
Go
go语言数组与切片
go语言数组与切片
|
3天前
|
存储 安全 Go
Go语言切片:从入门到精通的深度探索###
本文深入浅出地剖析了Go语言中切片(Slice)这一核心概念,从其定义、内部结构、基本操作到高级特性与最佳实践,为读者提供了一个全面而深入的理解。通过对比数组,揭示切片的灵活性与高效性,并探讨其在并发编程中的应用优势。本文旨在帮助开发者更好地掌握切片,提升Go语言编程技能。 ###
|
28天前
|
Go 索引
Go to Learn Go之切片
Go to Learn Go之切片
26 1
|
1月前
|
编译器 Go 索引
Go数组、多维数组和切片(动态数组),及常用函数len(),cap(),copy(),append()在切片中的使用
本文介绍了Go语言中数组、多维数组和切片(动态数组)的基本概念和操作,包括数组的定义、初始化、访问,多维数组的定义和访问,以及切片的创建、使用和扩容。同时,还讲解了切片中常用的函数len()、cap()、copy()和append()的使用方法。
|
2月前
|
Go
Go 1.21的新特性: 切片和映射
Go 1.21的新特性: 切片和映射
|
2月前
|
存储 Go
go 切片长度与容量的区别
go 切片长度与容量的区别
|
2月前
|
存储 缓存 Go
在 Go 中如何复制切片和映射?
【8月更文挑战第31天】
55 0
|
2月前
|
存储 Go 数据处理
C 数组和 Go 切片的区别详解
【8月更文挑战第31天】
32 0