Задать вопрос
@babderos

Почему в Go перезаписываются элементы массива, когда я изменяю копию этого массива?

Есть код, где я работаю со структурой.
Мне нужно для определенной работы, выбрать нужную структуру по ключу - поработать с ней, изменить элементы массивов, выполнить запросы. И так я могу вызывать эту структуру несколько раз.

Но после первой же обработки структуры, изменяя элементы массива в копии структуры - меняется также значение элементов массива (слайса) в глобальном Мапе

Как исправить это? Или как избавиться от такого поведения и добиться, чтобы значения в глобальном Мапе не изменялись, а изменялись лишь во временной структуре для работы?

Вот код
package main

import "fmt"

type typeElMap struct {
	Name string
	Data []string
}

var MainData map[string]typeElMap


func main(){

	MainData = make(map[string]typeElMap,0)

	MainData["key"] = typeElMap{Name:"Digit", Data: []string{"1","2","3"}}

	tmp := MainData["key"]

	// WORK
	tmp.Name = "NEW NAME"
	tmp.Data[0] = "A"
	// END WORK

	fmt.Println(MainData["key"]) // Результат {Digit [A 2 3]} - имя НЕ поменялось, а массив изменился




	a:= []int{1,2,3}
	b := a
	b[0] = 777
	fmt.Println(a) // Тоже результат [777 2 3]

}
  • Вопрос задан
  • 210 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
longclaps
@longclaps
Используй deep copy.
Ответ написан
Комментировать
Такое поведение потому что слайс — это просто структура, в которой 3 поля:
1. Указатель на начало данных.
2. Количество элементов, которое уже используется в слайсе
3. Общее количество элементов в выделенном блоке памяти (слайс может расти до этого порога без аллокации памяти)
То есть, данных по сути в слайсе нет, он просто указывает на данные. Копируя переменную слайса, вы копируете указатель.
Подробнее тут

Как выше правильно сказали, вам нужно deep copy
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы