返回

切片扩容:改进后 - 清空 `make`

后端

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 开发程序,我强烈建议您使用新的扩容机制。