Оба среза меняются, если один меняется - PullRequest
0 голосов
/ 14 февраля 2020

По какой-то причине в 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)

}

результат:

оригинал

[AB C DEFGHIJKLMNOPQRSTUVWX YZ]

после назначения, но ничего не изменилось ни в одном из срезов

[AB C DFGHIJKLMNOPQRSTUVWXY Z]

[AB C DFWHYJFXFJFXVFXWRXJFXVFXFXVFXFXVFXWRXJFXWRJRJKJKJVRKKHT

после назначения удаления A и добавления b только к флеттерам, но почему буквы тоже изменились?

[B C DFGHIJKLMNOPQRSTUVWXY Z b]

[B C DFGHIJKLMNOPQRSTUVWXY z]

1 Ответ

0 голосов
/ 14 февраля 2020

Срез - это представление массива. В вашем коде letters и fletters оба ссылаются на один и тот же базовый массив, поэтому изменения, внесенные в один, также видны другому.

Срез создаст новый массив и скопирует содержимое старый в новый только в результате операции append, и только в том случае, если емкость базового массива недостаточна для хранения новых элементов. Ваши операции никогда не требуют изменения емкости базового массива, поэтому все срезы указывают на один и тот же базовый массив.

...