为啥切片追加元素不更新引用的元素?
Posted
技术标签:
【中文标题】为啥切片追加元素不更新引用的元素?【英文标题】:Why slice append element not update referenced element?为什么切片追加元素不更新引用的元素? 【发布时间】:2022-01-06 21:59:17 【问题描述】:这条规则就是我对 Go 中 slice 的了解
当元素的数量和容量的宽度相同时(len(fruits) == cap(fruits)),append() 产生的新元素就是新的引用。 当元素个数小于容量(len(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]
为什么水果的价值不是【香蕉芒果龙木瓜】?
【问题讨论】:
您的两个“规则”都没有描述切片的工作方式。首先通过忘记“参考”来理解切片。在围棋中没有崇敬。然后阅读go.dev/blog/slices和go.dev/blog/slices-intro 【参考方案1】:代码的工作原理如下:
就在将papaya
附加到fruits
之前,
fruits = "banana", "mango", "tomato"
而newFruits
指向与fruits
相同的数组,但从mango
开始。
当您将papaya
附加到fruits
时,将创建一个容量=6 的新数组,因为fruits
的容量为3。fruits
现在指向这个新数组,具有4 个值:
fruits = "banana", "mango", "tomato", "papaya"
newFruits
仍然指向旧的 fruits
数组,并包含 2 个元素。
【讨论】:
我明白了……“创建了一个新数组”和“newFruits 仍然指向旧水果”让我明白了以上是关于为啥切片追加元素不更新引用的元素?的主要内容,如果未能解决你的问题,请参考以下文章