首页 >后端开发 >Golang >Golang 的 `append()` 函数何时分配新切片?

Golang 的 `append()` 函数何时分配新切片?

Patricia Arquette
Patricia Arquette原创
2024-11-02 03:27:30271浏览

When Does Golang's `append()` Function Allocate a New Slice?

Golang Append() 何时创建新切片?

与内置 API 文档相反,append() 函数并不总是创建新切片。这是由原始切片的容量和要添加的元素数量决定的。

在提供的代码片段中,递归地创建布尔值组合,感叹号表示发送到通道的切片添加选项函数。然而,在 main() 中另一侧出现的切片被修改了。

切片数据类型与其内部表示之间的区别引起了混乱。切片描述符由两个整数(长度和容量)和一个指向底层数据的指针组成。因此,append() 返回一个带有新描述符的新切片,但指向数据的指针相同。

这在以下代码示例中进行了说明:

<code class="go">package main

import "fmt"

func main() {
    s := make([]int, 0, 5) // Create a slice with zero length and capacity 5
    s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers

    a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same)
    fmt.Println(a)

    b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same)
    fmt.Println(b)
    fmt.Println(a)
}</code>

输出:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 6]

这表明 a 和 b 共享相同的数据指针,因为原始切片仍然有容量。但是,如果我们将容量减少到 4:

<code class="go">s := make([]int, 0, 4)</code>

输出变为:

[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 5]

由于原始切片不再有足够的容量,append() 创建一个新切片b.

的新数据指针

以上是Golang 的 `append()` 函数何时分配新切片?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn