2012-04-03 13 views
9

मैं chan X पर एक अनुरोध का उत्तर भेज रहा हूं, जहां X एक संरचना है। अनुरोध एक खोज ऑपरेशन है, इसलिए आदर्श रूप से मैं X वापस लौटने में सक्षम होना चाहता हूं, या रिपोर्ट नहीं मिली थी।क्या गो में "शायद" या "विकल्प" प्रकार अनुकरण करने का कोई अच्छा तरीका है?

यह हास्केल में Maybe X या OCaml में x option के लिए एक कार्य होगा। क्या गो में ऐसा करने का कोई अच्छा तरीका है? मैं एक सूचक वापस नहीं कर रहा हूं (जैसा कि मूल ऑब्जेक्ट मैं लौट रहा हूं बाद में संशोधित किया जा सकता है), इसलिए मैं केवल nil वापस नहीं कर सकता।

संपादित करें: अभी मैं इसे एक chan interface{} बना रही हूँ और या तो एक X या nil भेजने, लेकिन यह बदसूरत है और टाइप-सुरक्षा को हरा दिया।

+0

https://github.com/alphazero/future.go में मैं टपल (इंटरफ़ेस {}, झंडा) चैनल पेलोड के रूप में के लिए चुना। दिलचस्प है, कल इसे धक्का दिया। – alphazero

उत्तर

2

यदि आप interface {} का उपयोग कर रहे हैं तो आप प्रभावी रूप से एक सूचक वापस कर रहे हैं। interface {} को *X में क्यों न बदलें और ऑब्जेक्ट की प्रतिलिपि वापस कर लें? अगर मैं chan *X का उपयोग न करने के पीछे आपकी तर्क समझता हूं, तो यह है।

+0

उह, हाँ आप करते हैं। मुझे लगता है कि यह एक विकल्प है। क्या यह '& * ऑब्जेक्ट 'कहने के लिए ऐसा करने का सबसे सस्ता/आसान तरीका है? (यदि यह भी अनुमति है (मैं जांच करूँगा।)) – Ashe

+0

'प्रतिबिंबित' पैकेज का उपयोग किए बिना मैं दो तरीकों से सोच सकता हूं 'ए: = बी; रिटर्न एंड ए 'और' रिटर्न एंड थिस्टीप {इसफील्ड: बी। थिस्फील्ड, इसथफील्ड: बी। थिसोथफील्ड} '। मैंने बेंचमार्क नहीं किया है, लेकिन पूर्व कम निर्देशों का उपयोग करता है। – mkb

+0

यह निश्चित रूप से कम कोड का उपयोग करता है, और रखरखाव के मुद्दे से कम है, इसलिए मैं इसके साथ जाऊंगा। चीयर्स! – Ashe

3

एक और तरीका ठीक बूल जोड़ना होगा। आप या तो एक्स के लिए इसे जोड़ने या लपेट एक्स सकता है, जैसे struct {X; ok bool}

5

मैं सूचक प्रकार, का उपयोग जहां:

  • Maybe X = *X
  • Nothing = nil
  • Just x = &x
1

मुझे हाल ही में एक वैकल्पिक/शायद एक प्रकार के whe का प्रतिनिधित्व करने की आवश्यकता है मैं एक सूचक का उपयोग नहीं करना चाहता था और शून्य मान पर भरोसा नहीं कर सका। मैंने नीचे लिखने का विकल्प चुना, जो आपके लिए किसी भी प्रकार को लपेटेगा। यह आपके उपयोग के मामले में भी फिट हो सकता है।

https://github.com/leighmcculloch/go-optional

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

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