2014-10-27 7 views
7

मैं निम्नलिखित struct की गहरी प्रतिलिपि प्रदर्शन करने के लिए प्रयास कर रहा हूँ:आप गो में एक स्ट्रक्चर की गहरी प्रति कैसे करते हैं?

// 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" पैकेज अब काम नहीं करता है क्योंकि यह कुछ फ़ंक्शंस का उपयोग करता है जिन्हें गो 1

+1

इसमें कुछ भी नहीं बनाया गया है। हालांकि, [डीपीकॉपी जैसे पैकेज जो आपके लिए यह कर सकते हैं] (http://godoc.org/code.google.com/p/rog-go/ एक्सपी/गहरी कॉपी) ("प्रायोगिक" स्थिति को ध्यान में रखते हुए) –

+0

@ सिमॉन व्हाइटहेड मैंने उस पैकेज को एक कोशिश दी। दुर्भाग्यवश, यह उन कार्यों का एक समूह का उपयोग करता है जिन्हें गो 1 –

+0

माफी के रिलीज के साथ बहिष्कृत किया गया था .. मुझे एहसास नहीं हुआ (मैंने इसे 1 से पहले इस्तेमाल किया होगा)। –

उत्तर

9

रिलीज़ के साथ बहिष्कृत किया गया था। मुझे कॉपी की गई संपत्ति को मूल संपत्ति में सौंपा जाना चाहिए था।

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 
    } 
} 
संबंधित मुद्दे