登录
首页 >  Golang >  Go问答

Golang append() 什么时候创建一个新切片?

来源:Golang技术栈

时间:2023-04-06 09:40:22 451浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Golang append() 什么时候创建一个新切片?》,涉及到golang,有需要的可以收藏一下

问题内容

根据内置 api 文档,当原始切片的容量不够大时, append() 将重新分配并复制到新的数组块中。

这是用于创建字母组合(在本例中为布尔值)的递归算法的(简化版本)。字母表的成员(真、假)被递归地添加到一个切片中,直到它达到正确的长度,此时它通过通道发送。

package main

import (
    "fmt"
)

func AddOption(c chan []bool, combo []bool, length int) {
    if length == 0 {
        fmt.Println(combo, "!")
        c 

这是此代码的操场链接。在输出中:

[true true true true] !
[true true true false] !
[true true true false]
[true true true false]
[true true false true] !
[true true false false] !
[true true false false]
[true true false false]
[true false true true] !
[true false true false] !
[true false true false]
[true false true false]
[true false false true] !
[true false false false] !
[true false false false]
[true false false false]
[false true true true] !
[false true true false] !
[false true true false]
[false true true false]
[false true false true] !
[false true false false] !
[false true false false]
[false true false false]
[false false true true] !
[false false true false] !
[false false true false]
[false false true false]
[false false false true] !
[false false false false] !
[false false false false]
[false false false false]

以感叹号结尾的行是从 AddOption 发送到通道的行。那些没有出现在另一边的东西(即在 main() 中)。很明显,通过通道发送的切片在发送后会发生变化。

由于 AddOption 在发送切片后立即返回,因此修改必须来自代码块

var newCombo []bool
for _, ch := range []bool{true, false} {
    newCombo = append(combo, ch)
    AddOption(c, newCombo, length-1)
}

但是,根据文档, append() 应该返回一个新切片(cap(combo) 不够大)。根据这个答案,发送给 AddOption 的切片描述符应该是一个副本;这不是真的吗?据我所知,作为 AddOption() 的第二个参数发送的值要么是指向切片描述符的指针,要么 append() 没有返回新切片。

正确答案

append()创建一个新切片时,它不会创建一个比之前的切片大一个的切片。它实际上创建了一个已经比前一个大几个元素的切片。看看这段代码:

package main

import "fmt"

func main() {
    var sl []bool

    for i := 0; i 

Playground

如果您运行此代码,您会看到容量最初在每次分配时翻倍;对于更大的切片大小,当然会更改此策略。

理论要掌握,实操不能落!以上关于《Golang append() 什么时候创建一个新切片?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表