2015-07-25 3 views
1

Я пытаюсь сделать глубокую копию структуры в go. Прежде чем идти и строить решение самостоятельно, я попытался найти идиоматический способ сделать это в режиме go. Я нашел ссылку на реализацию this. Однако, похоже, он устарел и не активно поддерживается. Я уверен, что это сценарий, который люди требуют от времени от времени, поэтому я должен что-то пропускать. Есть ли у кого-нибудь указания?Сделайте копию структуры

+1

'а: = b'? Что вы подразумеваете под глубоким копированием структуры? Глубокие указатели копий в структуре? – inf

+2

Стандартная библиотека не содержит функции глубокой копии, поскольку существует множество вариантов того, как приложение может это сделать. Кроме того, для приложения не сложно реализовать определенную функцию копирования. Что вы хотите сделать? –

ответ

1

Более позднюю версию кода google deepcopy можно найти в margnus1/go-deepcopy.

Это иллюстрирует, почему в стандартной библиотеке нет глубокой копии.

// basic copy algorithm: 
// 1) recursively scan object, building up a list of all allocated 
// memory ranges pointed to by the object. 
// 2) recursively copy object, making sure that references 
// within the data structure point to the appropriate 
// places in the newly allocated data structure. 

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

// Copy makes a recursive deep copy of obj and returns the result. 
// 
// Pointer equality between items within obj is preserved, 
// as are the relationships between slices that point to the same underlying data, 
// although the data itself will be copied. 
// a := Copy(b) implies reflect.DeepEqual(a, b). 
// Map keys are not copied, as reflect.DeepEqual does not 
// recurse into map keys. 
// Due to restrictions in the reflect package, only 
// types with all public members may be copied. 
// 
func Copy(obj interface{}) (r interface{}) { 

Я уверен, что это сценарий, что люди много требуют от времени до времени, поэтому я должен быть отсутствующий что-то

Как mentioned in this thread:

Передача значений структуры, в отличие от указателей на структуру, например, в целом достаточно хороша. Если программист достаточно хорош для эффективного проектирования структур дерева или графа, то они, вероятно, могут предвидеть проблемы с совместным использованием такой структуры.
Многие из нас считают отсутствие обязательного поведения с глубоким копированием для функции, поскольку мы хотим, чтобы Go предоставил инструменты для обеспечения безопасности, а не препятствия для повышения эффективности.


Более свежая и полируется версия DeepCopy является ulule/deepcopier

// Deep copy instance1 into instance2 
Copy(instance1).To(instance2) 
Смежные вопросы