我试图执行以下结构的深层副本:
// Ternary Tree
type Tree struct {
Left *Tree
Mid *Tree
Right *Tree
Value interface{}
Parent *Tree
Orientation string
IsTerminal bool
Type string
}
以下是我的抱歉尝试。看起来我在根处创建了一个新树,但它的子节点仍指向内存中的相同地址。
func (tree *Tree) CopyTree() *Tree {
if (tree == nil) {
return nil
} else {
copiedTree := &Tree {
tree.Left.CopyTree(),
tree.Mid.CopyTree(),
tree.Right.CopyTree(),
tree.Value,
tree.Parent.CopyTree(),
tree.Orientation,
tree.IsTerminal,
tree.Type}
return copiedTree
}
}
是否有任何有用的结构可以帮助深度复制结构?如果没有,我将如何自己执行此深层复制?注意," deepcopy" package不再有效,因为它使用了Go 1
版本弃用的一些函数答案 0 :(得分:9)
我很亲密。我应该将copiedTree分配给父属性。
func (tree *Tree) CopyTree() *Tree {
if (tree == nil) {
return nil
} else {
copiedTree := &Tree {
tree.Left.CopyTree(),
tree.Mid.CopyTree(),
tree.Right.CopyTree(),
tree.Value,
nil,
tree.Orientation,
tree.IsTerminal,
tree.Type,
}
if copiedTree.Left != nil {
copiedTree.Left.Parent = copiedTree
}
if copiedTree.Right != nil {
copiedTree.Right.Parent = copiedTree
}
if copiedTree.Mid != nil {
copiedTree.Mid.Parent = copiedTree
}
return copiedTree
}
}
答案 1 :(得分:-1)
您可以通过 encoding/gob
来回:
package main
import (
"bytes"
"encoding/gob"
)
func copyStruct(in, out interface{}) {
buf := new(bytes.Buffer)
gob.NewEncoder(buf).Encode(in)
gob.NewDecoder(buf).Decode(out)
}
func main() {
type date struct { Month, Day int }
a := date{12, 31}
var b date
copyStruct(a, &b)
}
答案 2 :(得分:-2)
json.marshal和json.unmarshal怎么样。如果性能至关重要,我建议使用protobuf。