出于某种原因在Go语言中,如果我更改其中一个,则两个切片都会更改
package main
import (
"fmt"
"sort"
)
func deleteAr(s []string, index int) []string{
return append(s[:index], s[index+1:]...)
}
func main() {
var letters =[] string {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}
fmt.Println("original")
fmt.Println(letters)
var fletters =[] string {}
letters= deleteAr(letters, sort.StringSlice(letters).Search("E"))
fletters=letters
fmt.Println("after assigning but nothing changed in either slices")
fmt.Println(letters)
fmt.Println(fletters)
fletters = deleteAr(fletters , sort.StringSlice(fletters).Search("A"))
fletters = append(fletters , "b")
fmt.Println("after assigning deleting A and appending b to only fletters, but why letters changed too?")
fmt.Println(letters)
fmt.Println(fletters)
}
原始
[[A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
分配后但两个切片均未更改
[[A B C D F G H I J K L M N O P Q R S T U V W X Y Z]
[[A B C D F G H I J K L M N O P Q R S T U V W X Y Z]
在分配删除A并将b附加到字母后,为什么字母也改变了?
[[B C D F G H I J K L M N O P Q R S T U V W X Y Z b]
[[B C D F G H I J K L M N O P Q R S T U V W X Y Z b]
切片是阵列上的视图。在您的代码中,letters
和fletters
都引用相同的基础数组,因此对另一个数组所做的更改也对另一数组可见。
切片将创建一个新数组,并且仅在append
操作的结果下,并且仅在基础数组的容量不足以容纳新元素的情况下,才将旧数组的内容复制到新数组中。您的操作永远不需要更改基础阵列容量,因此所有切片均指向同一基础阵列。