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动态构建切片。
通过这些方法,你可以确保切片的行为符合预期,并避免在后续操作中出现意外的零值元素。
热门推荐
陶瓷釉内胆和不锈钢内胆哪个好?全面对比分析
湖北银行所有网点配备“救命利器”AED 面向社会急救使用
牙龈突然出血什么原因造成的
国家队出手!更适合四川娃娃的减肥食谱来了……快收藏→
如何在社交媒体上写出吸引人的说说,记录生活点滴与真实情感
西交利物浦大学就业率分析与解读
台湾股市买跌策略:规则、风险与实战指南
诺如病毒抗体能持续多久有效
干燥综合征对生活的影响
为什么被誉为最强大轰炸机的图160,在俄乌冲突中无用武之地?
徐州两天一夜旅游攻略路线
美的滚筒洗衣机E10故障处理指南
官方服与其他渠道服差异及其在选择游戏时的优势
如何查询自己账号所在的服务器?
什么是劳动合同条款
如何判断一只股票是否适合长期持有?这种判断标准在不同市场环境下有何变化?
怎么区分OLED屏幕和LCD屏幕
面对史上首个“特大地震预警”,为何日本社会没有大范围恐慌?
新冠症状阳性怎么办
如何选择适合您需求的电动执行机构
身边辐射强不强?湖南首批电磁辐射环境自动监测站投入使用
校长文化领导力的提升策略
寓意好的树木取名男孩
公共艺术,让孤独者在旅行中共享爱情
糖尿病人一顿吃多少杂粮饭
良渚文明与古希腊文明有相似性?
中国养老保险缴纳金额及年限解析
不只是推拿:深入探索正骨疗法的科学原理
工控一体机选择移动端CPU,性能与稳定性的完美平衡
成年人最舒服的活法:一半争取,一半随缘