2016-07-14 9 views
5

मैं एक प्रकार के रूप में परिभाषित किया गया है:अप्रत्याशित फ़ील्ड के साथ संरचना को क्लोन कैसे करें?

type T struct { 
    S string 
    is []int 
} 

तो कैसे मैं इस प्रकार का ऑब्जेक्ट क्लोनिंग के बारे में जा सकते हैं? अगर मैं एक साधारण काम करते हैं:

p := T{"some string", []int{10, 20}} 
q := p 

फिर []int में किए गए बदलाव दोनों वस्तुओं प्रभावित करते हैं। चूंकि T.is निर्यात नहीं किया गया है, इसलिए इसे स्पष्ट रूप से कॉपी नहीं किया जा सकता है, भले ही प्रतिबिंबित करके निकाला गया हो।

मैं वर्तमान में प्रकार के पैकेज में Clone विधि की आपूर्ति कर रहा हूं। लेकिन यह अन्य पैकेजों में समान प्रकार के साथ मदद नहीं करता है। क्या इसे करने का और कोई तरीका है?

उत्तर

5

आप नहीं कर सकते। यह अप्रत्याशित फ़ील्ड का बिंदु है: केवल घोषित पैकेज उन्हें संशोधित कर सकता है।

ध्यान दें कि यदि T प्रकार एक और पैकेज में घोषित किया जाता है, तो आप भी लिख नहीं सकता:

p := somepackage.T{"some string", []int{10, 20}} 

क्योंकि यह परोक्ष unexported T.is क्षेत्र स्थापित करने के लिए एक संकलन समय त्रुटि में परिणाम कोशिश करते हैं और इस प्रकार हैं :

implicit assignment of unexported field 'is' in somepackage.T literal 

यदि आप के मालिक हैं (या आप संशोधित कर सकते हैं) पैकेज, सबसे अच्छा एक Clone() विधि या समारोह प्रदान करते हैं या प्रकारके लिए एक SetIs() विधि प्रदान करना है 0। यदि कोई तृतीय पक्ष पैकेज ऐसी कार्यक्षमता प्रदान नहीं करता है, तो आप इसके बारे में कुछ भी नहीं कर सकते हैं।

ध्यान दें कि पैकेज का उपयोग unsafe यह इस तरह काम करने के लिए संभव है, लेकिन जैसा कि इसके नाम का कहना है: यह असुरक्षित है और आप इसे से दूर रहना चाहिए।

भी ध्यान रखें कि आप T जहां is कॉपी नहीं है नए मूल्यों बना सकते हैं लेकिन अपनी तरह का zero value हो जाएगा (जो []int के मामले में nil हो जाएगा):

var r somepackage.T 
s := somepackage.T{S: p.S} 

fmt.Printf("%q\n", r) 
fmt.Printf("%q\n", s) 

कौन सा उत्पादन होगा:

{"" []} 
{"some string" []} 

लेकिन आप किसी भी गैर शून्य unexported क्षेत्र T.is के लिए मूल्य निर्धारित नहीं कर सकते।

संबंधित मुद्दे