当前位置: 首页 > 面试题库 >

为什么append()修改提供的切片?(参见示例)

钱凌
2023-03-14
问题内容

您可以在Go Playground上运行示例代码。

这是代码:

package main

import "fmt"

func main() {
    numbers := []int{1, 2, 3, 4, 5}

    fmt.Println(numbers)
    _ = append(numbers[0:1], numbers[2:]...)
    fmt.Println(numbers)
}

输出:

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

为什么numbers通过追加修改切片?这是预期的行为吗?如果可以,您能否向我解释原因?我以为append不会修改其参数。


问题答案:

参见http://blog.golang.org/go-slices-usage-and-
internals

如果要追加到切片的内容不适合当前切片的容量,则append函数 可以 分配新的基础数组。Append 确实会
修改基础数组。您必须将其分配回变量的原因是,正如我在第一句中所说的那样,可以重新分配基础数组,而旧切片仍将指向旧数组。

看到这个播放示例,以确切地了解我在说什么。



 类似资料:
  • 问题内容: public class StackOverFlow { public static void main(String[] args) { ArrayList al = new ArrayList (); al.add(“A”); al.add(“B”); markAsNull(al); System.out.println(“ArrayList elements are “+al);

  • Go语言的内建函数 append() 可以为切片动态添加元素,代码如下所示: 不过需要注意的是,在使用 append() 函数为切片动态添加元素时,如果空间不足以容纳足够多的元素,切片就会进行“扩容”,此时新切片的长度会发生改变。 切片在扩容时,容量的扩展规律是按容量的 2 倍数进行扩充,例如 1、2、4、8、16……,代码如下: 代码输出如下: len: 1  cap: 1 pointer: 0

  • 问题内容: 我有以下代码: 但是我想将一个指向字节切片的指针传递给另一个函数,并在那里切片,所以类似: 它给我一个错误,我不能在函数参数中使用type 作为类型,并且不能对type进行切片。怎么了?默认情况下切片不是通过引用传递的吗?我试图在没有指针的情况下执行此操作,但是它不起作用- 正在复制数组。我怎样才能做到这一点? 问题答案: 该错误来自您尚未发布的拼写错误(您尝试传递一个切片而不是指向的

  • 问题内容: 我正在使用: Python 3.4.2 PyMongo 3.0.2 mongolab运行mongod 2.6.9 uWSGI 2.0.10 CherryPy 3.7.0 nginx 1.6.2 uWSGI启动参数: 我一次设置了MongoClient: 我尝试将JSON字典保存到MongoDB: 它通过执行与mongodb相同的代码路径的单元测试来工作。但是,当我使用HTTP POST

  • 选择一个或多个切片 执行下列操作之一: 选择切片选择工具 并在图像中单击相应的切片。处理重叠切片时,单击底层切片的可见部分选择底层切片。 选择切片选择工具,然后按住 Shift 键单击,以便将切片添加到选区。 在“存储为 Web 和设备所用格式”对话框中选择切片选择工具,在自动切片内或图像区域外单击,然后在要选择的切片上拖移。(在用户切片内单击并拖动可移动切片。) 选取“文件”>“存储为 Web

  • 问题内容: 为什么执行速度比切片慢? 令人惊讶的是,即使包括长度计算在内,切片仍然明显更快: 注意:此行为的第一部分已在 Python的数据分析 (第3章)中进行了说明,但未提供任何解释。 。 如果有帮助:这是;的C代码。这是输出: 问题答案: __可以通过考虑操作员完成工作所需的时间来解释 某些 性能差异: 差的另一部分可以通过以下事实来解释是一个 函数 ,和甚至无操作函数调用需要一点时间: 这