Go语言中切片`make`函数的正确使用与错误解决方案
创作时间:
作者:
@小白创作中心
Go语言中切片`make`函数的正确使用与错误解决方案
引用
CSDN
1.
https://m.blog.csdn.net/qq_33665793/article/details/145014597
在Go语言开发中,切片的正确使用是避免程序出现意外行为的关键。本文通过一个常见的切片初始化错误案例,深入讲解了如何正确使用
make
函数创建切片,并提供了三种有效的解决方案。
在 Go 语言中,切片是一个动态数组,它可以根据需要自动扩展。当你需要创建一个切片并初始化其容量时,通常会使用 make
函数。使用 make
时,必须明确指定切片的长度(len
)和容量(cap
)。切片的正确初始化对于避免后续追加操作时出现意外行为至关重要。
常见错误:未定义正确的切片初始值
一种常见的错误是创建切片时未正确初始化其长度和容量,导致后续的数据追加操作发生了意外的行为,例如切片在已经包含了零值元素后才开始追加数据。此类错误通常发生在对 make
函数的误用时。
错误示例:未正确初始化切片
假设我们在程序中创建了一个长度为 9,容量为 9 的切片,但没有明确地为切片赋初值,最终会出现问题,原因是切片元素默认值是零值(对于整型来说是 0
)。
package main
import "fmt"
func main() {
// 错误的切片初始化:创建长度为 9,容量为 9 的切片,但未显式初始化
arr := make([]int, 9) // 默认会被填充为9个零值元素
fmt.Println("Initial slice:", arr)
// 在已有的9个零值元素后追加数据
arr = append(arr, 10, 20, 30)
fmt.Println("After append:", arr)
}
输出结果:
Initial slice: [0 0 0 0 0 0 0 0 0]
After append: [0 0 0 0 0 0 0 0 0 10 20 30]
错误分析
- 切片
arr
在初始化时,长度为 9,容量为 9,且未提供具体的值,因此切片中的每个元素都被默认填充为零值(在这里是0
)。 - 然后,我们使用
append
函数追加了三个新元素:10
,20
,30
。 - 最终,切片
arr
成为[0 0 0 0 0 0 0 0 0 10 20 30]
,多出了 9 个零值元素。
问题的关键在于我们没有显式初始化切片的值,而是让 Go 默认填充零值。这会导致后续对切片的操作不如预期,特别是在你需要确保切片元素是有效数据时。
正确的切片初始化方式
要解决这个问题,我们需要明确指定切片的初始值,而不仅仅是长度和容量。可以通过以下几种方式来正确初始化切片:
方案 1:使用 make
并赋初值
package main
import "fmt"
func main() {
// 正确的切片初始化:创建长度为 9,容量为 9 的切片,并且显式给元素赋值
arr := make([]int, 9)
for i := range arr {
arr[i] = i + 1 // 给切片元素赋一个非零的值
}
fmt.Println("Initial slice:", arr)
// 在已有的9个有效数据后追加数据
arr = append(arr, 10, 20, 30)
fmt.Println("After append:", arr)
}
输出结果:
Initial slice: [1 2 3 4 5 6 7 8 9]
After append: [1 2 3 4 5 6 7 8 9 10 20 30]
这种方式确保切片 arr
在初始化时包含有效数据(1
到 9
),而不是默认的零值。之后,我们通过 append
正确地添加了新的元素。
方案 2:通过字面量直接初始化切片
如果我们已经知道切片的初始内容,可以直接使用切片字面量进行初始化,而无需使用 make
。
package main
import "fmt"
func main() {
// 直接使用字面量初始化切片
arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("Initial slice:", arr)
// 在已有的9个有效数据后追加数据
arr = append(arr, 10, 20, 30)
fmt.Println("After append:", arr)
}
输出结果:
Initial slice: [1 2 3 4 5 6 7 8 9]
After append: [1 2 3 4 5 6 7 8 9 10 20 30]
这种方式直接使用切片字面量初始化切片,使得切片的初始值更为直观。
方案 3:通过 append
函数进行动态扩展
如果你不确定切片的初始长度,可以通过 append
函数动态地构建切片。append
会自动扩展切片的容量。
package main
import "fmt"
func main() {
var arr []int // 初始化为空切片
// 使用append动态添加元素
arr = append(arr, 1, 2, 3, 4, 5, 6, 7, 8, 9)
fmt.Println("Initial slice:", arr)
// 在已有的数据后追加更多元素
arr = append(arr, 10, 20, 30)
fmt.Println("After append:", arr)
}
输出结果:
Initial slice: [1 2 3 4 5 6 7 8 9]
After append: [1 2 3 4 5 6 7 8 9 10 20 30]
这种方法通过 append
函数动态地构建切片,并且避免了不必要的零值初始化。
总结
- 使用
make
创建切片时,需要明确知道切片的长度和容量。如果不想使用零值,必须在初始化时显式赋予切片元素值。 - 在创建切片时避免简单地使用
make([]int, 9)
这种方式,除非你确实需要一个长度为 9 的零值切片。 - 如果你不确定初始值或容量,可以使用切片字面量或
append
动态构建切片。
通过这些方法,你可以确保切片的行为符合预期,并避免在后续操作中出现意外的零值元素。
热门推荐
等温过程和理想气体定律的应用
心理学人格类型分为哪几种 16型人格最优秀的4人格
如何不内耗自己调整情绪
吃辣椒真的能减肥吗?对眼睛有好处吗?
辣椒和黄瓜可以一起吃吗
如何让肚脐保持干燥状态
宝宝晚上咳嗽的厉害怎么办
宝宝睡觉时采取什么姿势能缓解咳嗽的症状
盘点6部经过了时间考验的经典动漫:数码宝贝让人爱,火影值得看
为什么0和1的思维是计算机及其自动化的基本思维之一
勾股定理在现代几何学中的应用解析
射频溶脂瘦腰:哪些人适合?哪些人不适合?
如何选择最适合您的游戏分辨率?
跨越两千年,黄金还保值吗?
如何分辨金融市场的市场情绪?这对投资决策有何作用?
肺癌晚期一般能活几年?这些因素影响生存期
金融观察:中国扩内需 尚有很大空间
零基础英语学习顺序:从音标到词汇的系统化路径
打破国外垄断,利好帕金森患者:国产经颅“磁波刀”系统临床前实验在沪完成
打破国外垄断,利好帕金森患者:国产经颅“磁波刀”系统临床前实验在沪完成
起床头晕感觉天旋地转是什么原因
丰田Celica XX:传奇Supra的起点,经典跑车的诞生之路
传奇跑车再现经典:雪佛兰Corvette Stingray
东北三省2024年财政收入对比:辽宁近3000亿,吉林省暴涨,黑龙江呢
“馕言文”火了,网友:哎捧友,你的头里知识塔里木河一样流呢
《哪吒2》香港票房碾压港片,香港观众破防打0.5分:看的中途想走
美国公司付款预扣税处理全攻略:深入解析与实务指导
数学建模:人口增长问题(基于指数增长模型和阻滞增长模型)
Git Issue管理规范指南
《最美好的爱情》:一首动人的音乐诗篇