猿问

为什么切片追加元素不更新引用的元素?

这条规则就是我对 Go 中 slice 的了解

  • 当元素的数量和容量的宽度相同时(len(fruits) == cap(fruits)),append() 产生的新元素就是新的引用。

  • 当元素个数小于容量(len(fruits) < cap(fruits))时,新元素被放入容量范围内,导致所有其他具有相同引用的切片元素值发生变化。

我有这样的代码

package main


import (

    "fmt"

)


func main() {

    //declare slice

    var fruits = []string{"banana", "mango", "tomato"}


    //using two index technique to make slice

    var newFruits = fruits[1:2]


    //append element to fruits slice

    fruits = append(fruits, "papaya")

    

    //append element to newFruits slice

    newFruits = append(newFruits, "dragon")


    fmt.Println(cap(fruits)) //2

    fmt.Println(cap(newFruits)) //6

    fmt.Println(newFruits) //[mango dragon]

    fmt.Println(fruits) //[banana mango tomato papaya]

    

}

为什么水果的价值不是【香蕉芒果龙木瓜】?


智慧大石
浏览 80回答 1
1回答

繁华开满天机

以下是代码的工作原理:就在附加papaya到之前fruits,fruits&nbsp;=&nbsp;{"banana",&nbsp;"mango",&nbsp;"tomato"}并newFruits指向与 相同fruits但从 开始的数组mango。当您追加papaya到时fruits,将创建一个容量=6 的新数组,因为 的容量fruits为 3。fruits现在指向这个新数组,具有 4 个值:fruits&nbsp;=&nbsp;{"banana",&nbsp;"mango",&nbsp;"tomato",&nbsp;"papaya"}newFruits仍然指向旧fruits数组,并包含 2 个元素。
随时随地看视频慕课网APP

相关分类

Go
我要回答