切片扩容:改进后 - 清空 `make`
2023-09-28 17:45:28
Go 切片的扩容机制在最近版本中经历了一次巨大的改进,摒弃了原先通过 make
函数进行扩容的方式。现在,扩容基于容量和增长比例来实现。这种方法更为简单、高效,并且更易于理解和使用。
在较早的 Go 版本中,切片是通过 make
函数进行扩容的。这种方法需要创建并拷贝新的切片,这在某些场景下可能效率较低。
以下代码演示了使用 make
函数扩容切片的过程:
package main
func main() {
// 创建一个空的切片
slice := make([]int, 0)
// 向切片中添加元素
for i := 0; i < 100; i++ {
slice = append(slice, i)
}
// 打印切片的长度和容量
fmt.Println("Length:", len(slice))
fmt.Println("Capacity:", cap(slice))
}
这段代码首先创建一个空的切片 slice
,然后使用 append
函数向切片中添加元素。当切片的容量不足以容纳新元素时,append
函数会创建一个新的切片,并将旧切片中的元素复制到新切片中。
这种方法的缺点在于,它需要创建和拷贝新的切片,这可能会在某些场景下导致性能下降。
新的扩容机制则通过容量和增长比例来完成。这种方法不需要创建和拷贝新的切片,因此更加高效。
以下代码演示了使用新的扩容机制扩容切片的过程:
package main
func main() {
// 创建一个空的切片
slice := make([]int, 0)
// 向切片中添加元素
for i := 0; i < 100; i++ {
slice = append(slice, i)
}
// 打印切片的长度和容量
fmt.Println("Length:", len(slice))
fmt.Println("Capacity:", cap(slice))
}
这段代码与上一个示例类似,但它使用 append
函数来扩容切片,而不是 make
函数。append
函数将使用切片的容量和增长比例来确定是否需要创建新的切片。如果需要创建新的切片,append
函数将创建一个新的切片,并将旧切片中的元素复制到新切片中。
这种方法的优点在于,它不需要创建和拷贝新的切片,因此更加高效。
新的扩容机制还允许开发者指定扩容因子。扩容因子是一个介于 1 和 100 之间的数字,用于指定切片在扩容时应增加多少容量。
以下代码演示了如何指定扩容因子:
package main
func main() {
// 创建一个空的切片
slice := make([]int, 0)
// 向切片中添加元素
for i := 0; i < 100; i++ {
slice = append(slice, i)
}
// 使用扩容因子扩容切片
slice = append(slice, make([]int, 0, 20)...)
// 打印切片的长度和容量
fmt.Println("Length:", len(slice))
fmt.Println("Capacity:", cap(slice))
}
这段代码与上一个示例类似,但它在调用 append
函数时指定了一个扩容因子。在这种情况下,扩容因子为 20,这意味着切片在扩容时将增加 20 个容量。
新的扩容机制是一个非常有用的特性,它可以帮助开发者提高 Go 程序的性能。如果您正在使用 Go 开发程序,我强烈建议您使用新的扩容机制。