两个片段在Go语言中都改变了,如果一个被改变了

问题描述 投票:-2回答:1

出于某种原因在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]

go slice
1个回答
0
投票

切片是阵列上的视图。在您的代码中,lettersfletters都引用相同的基础数组,因此对另一个数组所做的更改也对另一数组可见。

切片将创建一个新数组,并且仅在append操作的结果下,并且仅在基础数组的容量不足以容纳新元素的情况下,才将旧数组的内容复制到新数组中。您的操作永远不需要更改基础阵列容量,因此所有切片均指向同一基础阵列。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.