2016-10-12 14 views
13

गोलांग में, मैं अपनी यात्रा विक्रेता समस्या के लिए एक भयानक टुकड़ा समारोह बनाने की कोशिश कर रहा हूं। ऐसा करने पर मैंने देखा कि जब मैंने स्लाइस को संपादित करना शुरू किया था तो मैंने दिया था जब मैंने इसे पारित किया था।क्या गोलांग स्लाइस मूल्य से गुजरती हैं?

कुछ डीबगिंग के बाद मुझे पता चला कि यह मेरे अंदर समारोह के अंदर टुकड़ा संपादित करने के कारण था। लेकिन चूंकि गोलांग को "मूल्य से गुजरना" भाषा माना जाता है, यह कैसे संभव है?

https://play.golang.org/p/mMivoH0TuV

मैं एक लिंक खेल का मैदान को दिखाने के लिए मैं क्या मतलब है प्रदान की है। लाइन 27 को हटाकर आप इसे छोड़ने से अलग आउटपुट प्राप्त करते हैं, इससे कोई फर्क नहीं पड़ता क्योंकि फ़ंक्शन को तर्क के रूप में पारित होने पर स्लाइस की अपनी प्रतिलिपि बनाना होता है।
क्या कोई इस घटना को समझा सकता है?

उत्तर

28

हां, गो में सब कुछ मूल्य से गुजरता है। स्लाइस भी। लेकिन एक स्लाइस वैल्यू हेडर है, जो बैकिंग सरणी के एक संगत खंड का वर्णन करता है, और स्लाइस वैल्यू में केवल उस सरणी में एक पॉइंटर होता है जहां तत्व वास्तव में संग्रहीत होते हैं। टुकड़ा मूल्य में इसके तत्व शामिल नहीं हैं (सरणी के विपरीत)।

तो जब आप किसी फ़ंक्शन पर स्लाइस पास करते हैं, तो पॉइंटर समेत इस हेडर से एक प्रतिलिपि बनाई जाएगी, जो एक ही बैकिंग सरणी को इंगित करेगी। स्लाइस के तत्वों को संशोधित करना बैकिंग सरणी के तत्वों को संशोधित करने का तात्पर्य है, और इसलिए सभी स्लाइस जो समान बैकिंग सरणी साझा करते हैं, वे परिवर्तन को "निरीक्षण" करेंगे।

क्या एक टुकड़ा शीर्षक में है देखने के लिए, बाहर की जाँच reflect.SliceHeader प्रकार:

type SliceHeader struct { 
    Data uintptr 
    Len int 
    Cap int 
} 

संबंधित/संभव डुप्लिकेट प्रश्न देखें: Are Golang function parameter passed as copy-on-write?

पढ़ें ब्लॉग पोस्ट: Go Slices: usage and internals

+0

तो होगा एक समाधान समारोह के अंदर टुकड़ा की एक स्थानीय प्रतिलिपि बनाने के लिए हो। और इसके बजाय संपादन? – duck

+1

@ user4901806 यदि आप उत्तीर्ण टुकड़े के तत्वों को संशोधित नहीं करना चाहते हैं (बैकिंग सरणी के तत्व इसे इंगित करते हैं), तो हाँ, एक प्रति बनाएं। – icza

+0

मुझे लगता है कि इसका मतलब यह होगा कि अगर हम तत्व जोड़ते हैं, तो यह मूल टुकड़ा में नहीं जोड़ा जाएगा। – Sahas

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