Как сделать копию фрагмента структуры - PullRequest
0 голосов
/ 04 марта 2020

У меня есть кусочек структуры. Я пытаюсь скопировать этот срез в новую переменную, поскольку мой исходный срез меняет модель лота для листа

type Timesheet struct {
    ID              *int64     `json:"id"`
    TimestampStart  *time.Time `json:"timestampStart"`
    TimestampEnd    *time.Time `json:"timestampEnd"`
}


SheetArrayCopy := make([]models.Sheet, len(sheetList))
copy(SheetArrayCopy, SheetList)
//several steps which goes through SheetList and changes the value of sheetList

Однако, когда я изменяю значение в sheetList,, значения SheetArrayCopy также меняются.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Из вашего вопроса и ссылки на пример @Masklinn. Я вижу, что вы устанавливаете значение с помощью * указателя (адрес, на который указывает указатель), что означает, что значение этого адреса устанавливается на новое значение.

Нет ничего общего с

copy

Что делает именно то, что означает. И в этом случае он клонирует значение указателей полей, которое указывает на адрес значений полей.

Проблема заключается в способе использования и установки значения указателей.

Есть 3 способа избежать проблемы, о которой вы упоминали.

  1. Напишите свой собственный фрагмент клона, который инициирует новые структуры, и клонируйте только значения из исходного фрагмента в новый.
  2. Все еще используете клон, но когда вы установите значение полей, установите указатели полей на новый адрес. Указатели элементов других слайсов по-прежнему указывают на старое значение.
  3. Не используйте указатель, если у вас нет особых причин.

Вы можете сослаться на мой код, который демонстрация моего ответа.

https://play.golang.org/p/-pIgEDEr-hI

Ссылка на указатель, которая указывает непосредственно на то, как использовать указатель. https://tour.golang.org/moretypes/1

0 голосов
/ 04 марта 2020

может быть, вы можете преобразовать это обратно в json и смонтировать это json в новое место назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...