2014-10-30 8 views
6

मैं एक गो फ़ंक्शन लिख रहा हूं जो कि पाइथन के itertools.permutations() की नकल करता है, लेकिन एक समय में एक को उपज करने के बजाय सभी क्रमिकताएं लौटाता है।गोलांग - अप्रत्याशित बहु-असाइनमेंट व्यवहार

मैं अनपेक्षित व्यवहार देख रहा हूँ जब कोड की निम्न पंक्तियों में एक ही समय में 2 चर को अद्यतन करने:

setcopy := append([]int(nil), sorted...) 
for i := 0; i < r; i++ { 
    c := counters[r-1-i] 
    current[i], setcopy = setcopy[c], append(setcopy[:c], setcopy[c+1:]...) 
} 

मैं सही परिणाम प्राप्त जब ऊपर अद्यतन decoupling:

current[i] = setcopy[c] 
setcopy = append(setcopy[:c], setcopy[c+1:]...) 

मैं मुख्य रूप से SliceTricks विकी आलेख से Pop और Delete उदाहरणों से प्रेरित था। क्या इसके बीच कोई महत्वपूर्ण अंतर है और मैं क्या करने की कोशिश कर रहा हूं?

यदि आप पूर्ण कोड (दोषपूर्ण आउटपुट का उदाहरण और डीबगिंग के लिए कुछ प्रिंट स्टेटमेंट्स सहित) देखना चाहते हैं, तो आप this Gist देख सकते हैं।

उत्तर

7

The Go Programming Language Specification

Assignments

दो चरणों में काम आय। सबसे पहले, सूचकांक एक्सप्रेशंस और पॉइंटर इंडिकेशंस (अंतर्निहित सूचक चयनकर्ताओं में संकेतों सहित) के संचालन और पर अभिव्यक्तियों का संचालन सही क्रम में किया जाता है। दूसरा, असाइनमेंट बाएं से दाएं क्रम में किए जाते हैं।

Operands

ऑपरेंड एक अभिव्यक्ति में प्राथमिक मूल्यों को दर्शाते हैं। एक ऑपरेंड एक शाब्दिक, एक (संभावित रूप से योग्य) गैर-रिक्त पहचानकर्ता होना चाहिए जो निरंतर, चर या फ़ंक्शन, फ़ंक्शन, या एक संश्लेषित अभिव्यक्ति प्रदान करने वाली विधि अभिव्यक्ति को दर्शाता है।

Order of evaluation

जब एक अभिव्यक्ति, असाइनमेंट की ऑपरेंड के मूल्यांकन, या बयान, सभी समारोह कॉल, विधि कॉल वापसी, और संचार संचालन शाब्दिक बाएँ से सही क्रम में मूल्यांकन किया जाता है।

उदाहरण के लिए, (समारोह स्थानीय) असाइनमेंट में

y[f()], ok = g(h(), i()+x[j()], <-c), k() 

समारोह कॉल और संचार आदेश च में))) हो (, ज (, मैं(), जे (, < - सी, जी(), और के()। हालांकि, उन घटनाओं का क्रम एक्स के मूल्यांकन और अनुक्रमण और वाई के मूल्यांकन की तुलना में निर्दिष्ट नहीं है।

Appending to and copying slices

तो रों की क्षमता काफी बड़ी अतिरिक्त मान फिट करने के लिए नहीं है, संलग्न एक नया, पर्याप्त रूप से बड़े अंतर्निहित सरणी कि दोनों मौजूदा टुकड़ा तत्वों और अतिरिक्त मान फिट बैठता है आवंटित करता है। अन्यथा, संलग्न अंतर्निहित सरणी का पुन: उपयोग करता है।

क्या एक नया अंतर्निहित सरणी आवंटित की जा रही है?

असाइनमेंट बयान

current[i], setcopy = setcopy[c], append(setcopy[:c], setcopy[c+1:]...) 

a := append(setcopy[:c], setcopy[c+1:]...) 
x := setcopy[c] 
y := a 
current[i], setcopy = x, y 

लेकिन अन्य ऑपरेंड के मूल्यांकन की तुलना में समारोह कॉल घटनाओं के क्रम निर्दिष्ट नहीं है (Order of evaluation) के बराबर हो गया लगता है।

+0

मुझे ऐसा नहीं लगता है, क्योंकि असाइनमेंट में उपयोग किए गए 'एपेंड' वास्तव में स्लाइस के आकार को कम करने/तत्व को हटाने (और इस तरह, एक नया अंतर्निहित सरणी आवश्यक नहीं होगा)। – Redy

+1

क्यों समझा नहीं सकता है, लेकिन आउटपुट वही है जैसे 'एपेंड' पहले चलता है: http://play.golang.org/p/ZQ-4cMyNTJ – twotwotwo

+0

ऐसा लगता है कि आपको बाएं से टू- सही eval आदेश - अगर कोई भी यहाँ एक अच्छे कारण के साथ आता है, मैं इस के साथ गोलंग-नट मारा होगा, वास्तव में अजीब लगता है। – twotwotwo

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