2012-07-08 21 views
15

कल्पना की मेरी पढ़ने से:लघु परिवर्तनीय घोषणाओं और गो में लंबे समय के बीच बंद होने का अंतर क्या है?

एक छोटी चर घोषणा ... प्रारंभकर्ता भाव लेकिन कोई प्रकार के साथ एक नियमित रूप से चर घोषणा के लिए एक आशुलिपि है ...

http://golang.org/ref/spec

मैंने सोचा होगा कि दोनों समान थे:

var f func() 
f = func() { 
    ... 
} 

और

f := func() { 
    ... 
} 

लेकिन ऐसा लगता है कि वे नहीं हैं। मैं एक बाहरी समारोह के अंदर एक आत्म पुनरावर्ती क्रिया रैप करने के लिए कोशिश कर रहा था, लेकिन यह काम करता है:

func myOuter() { 
    var f func() 

    f = func() { 
     f() 
    } 

    f() 
} 

लेकिन यह नहीं कह रही है आंतरिक समारोह में undefined: f

func myOuter() { 
    f := func() { 
     f() 
    } 

    f() 
} 

तो क्या अंतर है? क्या इसे संक्षिप्त रूप से घोषित करने के साथ लिखने का कोई तरीका है या मुझे इसे लंबे समय से लिखना है?

+0

धन्यवाद किसाकी, मैंने स्पष्ट रूप से गलती से दो बार चिपकाया। – Joe

उत्तर

14

f := func() { /* ... */ }var f func() = func() { /* ... */ } के समान है (लेकिन बाद में पैकेज स्तर पर बाद में किसी को अनुमति है)। आपके विशिष्ट मामले में, दो प्रकारों में से कोई भी काम नहीं करेगा, क्योंकि कथन का मूल्यांकन दाएं से बाएं से किया जाएगा। समाधान है - जैसा कि आपने पहले से ही सुझाव दिया है - कथन को दो में विभाजित करने के लिए। एक परिवर्तनीय और दूसरे को रिकर्सिव फ़ंक्शन को असाइन करने के लिए घोषित करने के लिए।

+1

धन्यवाद! आदेश या घोषणा मेरे लिए नहीं हुई थी। – Joe

+0

आह! अब मुझे इस कोड के लिए धन्यवाद फिर से जाना चाहिए, इस अंतर्दृष्टि के लिए धन्यवाद! –

0

आपके पहले दो कोड नमूने एक शर्त के तहत अर्थात् समान हैं: अभिव्यक्ति जो आपके चर को आवंटित की जा रही है संकलन समय पर हल करने की आवश्यकता है।

यह प्रत्येक परिस्थिति में समान होगा जब आप एक अभिव्यक्ति असाइन करने का प्रयास कर रहे हैं जो आपके द्वारा घोषित चर (या फ़ंक्शन) का संदर्भ देता है। यहां मुद्दा यह है कि क्योंकि गोलांग को सही-सहयोगी रूप से पार्स किया गया है, इसलिए यह बाईं ओर निर्दिष्ट करने से पहले दाईं ओर अभिव्यक्ति को हल करने का प्रयास करेगा। यदि आप घोषणा-असाइन ऑपरेटर के बाईं ओर चर का संदर्भ देते हैं, तो आप एक वेरिएबल का संदर्भ दे रहे हैं कि कंपाइलर के पास अभी तक ज्ञान नहीं है, इसलिए undefined: f

एक और उदाहरण है कि इसी तरह के परिणाम प्राप्त होते हैं:

x := x + 1 

इस हालांकि बाद से यह और अधिक स्पष्ट है कि एक्स अभी तक असाइन नहीं किया गया है लोगों को प्रयास करने के लिए के लिए अब तक कम आम है।

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