为什么切片附加元素不更新引用的元素?
Why slice append element not update referenced element?
这个规则就是我所知道的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]
}
为什么水果的价值不是[香蕉芒果龙木瓜]?
代码的工作原理如下:
就在将 papaya
附加到 fruits
之前,
fruits = {"banana", "mango", "tomato"}
和 newFruits
指向与 fruits
相同的数组,但从 mango
.
开始
当您将 papaya
附加到 fruits
时,将创建一个容量为 6 的新数组,因为 fruits
的容量为 3。 fruits
现在指向这个新数组,有 4 个值:
fruits = {"banana", "mango", "tomato", "papaya"}
newFruits
仍然指向旧的 fruits
数组,并包含 2 个元素。
这个规则就是我所知道的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]
}
为什么水果的价值不是[香蕉芒果龙木瓜]?
代码的工作原理如下:
就在将 papaya
附加到 fruits
之前,
fruits = {"banana", "mango", "tomato"}
和 newFruits
指向与 fruits
相同的数组,但从 mango
.
当您将 papaya
附加到 fruits
时,将创建一个容量为 6 的新数组,因为 fruits
的容量为 3。 fruits
现在指向这个新数组,有 4 个值:
fruits = {"banana", "mango", "tomato", "papaya"}
newFruits
仍然指向旧的 fruits
数组,并包含 2 个元素。