登录
首页 >  Golang >  Go问答

切片变量为何在进行多次分配时不会发生覆盖?

来源:stackoverflow

时间:2024-02-21 09:54:27 343浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《切片变量为何在进行多次分配时不会发生覆盖?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    printSlice(s)

    // Slice the slice to give it zero length.
    s = s[:0]
    printSlice(s)

    // Extend its length.
    s = s[:4]
    printSlice(s)

    // Drop its first two values.
    s = s[2:]
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

在这个程序中,为什么变量s的值在一次又一次重新赋值时不会被覆盖?

为什么当我们将其长度从 0 扩展到 4 时,它仍然保留相同索引处的基础值?

编辑:我按照建议阅读了切片内部结构,并且我知道切片只是底层数组的视图,但是,我的问题是,当只反复使用 s 时,不要使用 s1、s2、s3 变量名称,内部发生了什么以及为什么相同的变量没有被覆盖?


解决方案


这与 Go 中切片的工作方式有关。基本上,切片是包含三个内容的数据结构:

  1. 指向后备数组的指针。
  2. 长度(数组中“正在使用”的元素数量)。
  3. 容量(后备数组中索引的总数(数组大小固定))。

当您编写 s = s[:0] 时,您正在做的事情是创建一个新切片,其中的指针指向相同的支持数组,但长度不同。当您稍后编写 s = s[:4] 时,它又是相同的后备数组,因此 s[:0] 隐藏的元素仍然存在。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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