首页 > 后端开发 > Golang > 正文

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

Patricia Arquette
发布: 2024-11-02 03:27:30
原创
166 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!