Golang深入浅出之-切片(Slices)入门:创建、操作与扩容机制

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 【4月更文挑战第20天】Go语言中的切片是动态数组,提供灵活的操作和自动扩容。本文介绍了切片的创建(通过`make()`、数组创建和切片字面量)、基本操作(索引访问、切片、赋值追加和遍历)以及扩容机制(首次和后续扩容策略)。此外,还强调了切片与底层数组的关系、切片越界问题、`append()`的使用以及理解切片的关键点,帮助提升Go编程效率和代码质量。

切片(Slices)是Go语言中处理数组的灵活工具,提供了动态大小、灵活操作和自动扩容等功能。本文将深入浅出地介绍Go语言切片的创建、基本操作以及扩容机制,同时揭示相关常见问题与易错点,并通过代码示例进行说明。
image.png

一、切片创建

1. 直接创建

通过make()函数创建切片,指定元素类型、长度(可选)和容量(可选):

s := make([]int, 5) // 创建长度为5、容量也为5的int切片,默认值为0
s := make([]int, ¾, 10) // 创建长度为¾、容量为10的int切片,默认值为0

2. 从数组创建

通过数组名加索引来创建切片,隐式指向数组:

arr := [5]int{
   
   1, 2, 3, 4, 5}
s := arr[:] // 创建一个与arr等长、等容量的切片,引用相同的底层数组

3. 切片字面量

直接定义切片字面量,类似于数组字面量:

s := []int{
   
   1, 2, 3, 4, 5} // 直接创建长度为5、容量也为5的int切片

二、切片操作

1. 索引与访问

与数组类似,通过索引来访问切片元素:

s := []int{
   
   1, 2, 3, 4, 5}
element := s[2] // 访问第三个元素,值为3

2. 切片

使用[]操作符创建新的切片,不影响原切片:

s := []int{
   
   1, 2, 3, 4, 5}
subS := s[1:3] // 创建新切片,包含原切片第二个至第三个元素(不包括第四个)

3. 赋值与追加

使用赋值语句替换切片元素,或使用append()函数追加元素:

s := []int{
   
   1, 2, 3, 4, 5}
s[2] = 10 // 将第三个元素替换为10
s = append(s, 6) // 在切片末尾追加元素6

4. 遍历

使用for循环遍历切片:

s := []int{
   
   1, 2, 3, 4, 5}
for i, v := range s {
   
   
    fmt.Printf("Index: %d, Value: %d\n", i, v)
}

三、切片扩容机制

当切片容量不足以容纳新元素时,append()函数会自动扩容。扩容策略如下:

  1. 首次扩容:新容量为原容量的两倍加上新添加元素的数量。
  2. 后续扩容:若原容量已达到或超过1000,新容量为原容量的1.25倍加上新添加元素的数量;否则,新容量仍为原容量的两倍加上新添加元素的数量。

扩容可能导致性能开销和数据迁移,因此在预知切片大小的情况下,建议使用make()函数指定合适的初始容量。

四、常见问题与易错点

1. 切片与底层数组

切片是对底层数组的引用,修改切片元素会影响所有引用同一底层数组的切片。理解这一点有助于避免数据竞争和意外修改:

arr := [5]int{
   
   1, 2, 3, 4, 5}
s1 := arr[1:3]
s2 := arr[3:]
s1[0] = 10 // s1和s2共享同一底层数组,修改s1影响s2
fmt.Println(s2) // 输出:[10 4]

2. 切片越界

访问切片时,索引超出切片长度会导致panic。确保索引在有效范围内:

s := []int{
   
   1, 2, 3}
element := s[3] // panic: runtime error: index out of range [3] with length 3

3. append()返回值

append()函数可能改变原切片的地址,因此应始终使用其返回值:

s := []int{
   
   1, 2, 3}
s = append(s, 4) // 必须使用append的返回值,否则可能丢失新添加的元素

总结,深入理解Go语言切片的创建、操作以及扩容机制,识别并避免上述常见问题与易错点,是编写高效、易维护Go代码的关键。通过实践与学习,不断提升对切片的掌握程度,为应对各种编程任务做好准备。

目录
相关文章
|
1月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
43 4
|
1月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
39 3
|
1月前
|
Go
Golang语言之切片(slice)快速入门篇
这篇文章是关于Go语言中切片(slice)的快速入门教程,详细介绍了切片的概念、定义方式、遍历、扩容机制、使用注意事项以及相关练习题。
26 5
|
2月前
|
Go 开发者
Golang 中的异常处理机制详解
【8月更文挑战第31天】
36 0
|
2月前
|
测试技术 Go 开发者
掌握Golang测试:从入门到实践
【8月更文挑战第31天】
33 0
|
2月前
|
监控 Go
|
2月前
|
监控 Serverless Go
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
Golang 开发函数计算问题之Go 语言中切片扩容时需要拷贝原数组中的数据如何解决
|
4月前
|
Go
【golang】golang 字符串切片排序
【golang】golang 字符串切片排序
54 1
|
4月前
|
Kubernetes Go 云计算
Golang 入门技术文档
**Golang 技术文档摘要:** Golang,由Google开发,是一种静态强类型、编译型语言,广泛应用于云计算、网络编程和分布式系统。本文档介绍了Golang的基础和特性,包括安装配置、 HelloWorld 示例、基本语法,如变量推导、函数多返回值和并发编程(goroutine、channel)。Golang的并发模型基于轻量级goroutine和channel,支持高效并发处理。此外,文档还提及了接口和多态性,展示了如何使用接口实现类型间的交互。Golang在Docker、Kubernetes等项目中得到应用,适用于后端服务开发。【6月更文挑战第9天】
45 1
|
5月前
|
关系型数据库 MySQL Go
golang使用gorm操作mysql1
golang使用gorm操作mysql1
golang使用gorm操作mysql1
下一篇
无影云桌面