2013-03-11 5 views
6

मेरे पास एक ऐसा फ़ंक्शन है जो Card देता है, जो struct प्रकार या कोई त्रुटि है।जाने के बाद, संरचना या त्रुटि को वापस करने के लिए बेवकूफ तरीका क्या है?

समस्या यह है कि त्रुटि होने पर मैं फ़ंक्शन से कैसे वापस आ सकता हूं? nil structs के लिए मान्य नहीं है और मेरे पास मेरे Card प्रकार के लिए मान्य शून्य मान नहीं है।

func canFail() (card Card, err error) { 
    // return nil, errors.New("Not yet implemented"); // Fails 
    return Card{Ace, Spades}, errors.New("not yet implemented"); // Works, but very ugly 
} 

केवल वैकल्पिक हल मैंने पाया बल्कि एक Card की तुलना में एक *Card उपयोग करने के लिए, एक करना है यह या तो nil जब वहाँ एक त्रुटि है या यह एक वास्तविक Card बात जब कोई त्रुटि होता है, लेकिन है कि काफी अनाड़ी है।

func canFail() (card *Card, err error) { 
    return nil, errors.New("not yet implemented"); 
} 

क्या कोई बेहतर तरीका है?

संपादित करें: मुझे एक और तरीका मिला, लेकिन यह नहीं पता कि यह मूर्खतापूर्ण या यहां तक ​​कि अच्छी शैली है।

func canFail() (card Card, err error) { 
    return card, errors.New("not yet implemented") 
} 

card के बाद से एक नामित वापसी मान है, मैं इसे आरंभ करने के बिना उपयोग कर सकते हैं। यह अपने तरीके से शून्य हो गया है, मुझे वास्तव में परवाह नहीं है क्योंकि कॉलिंग फ़ंक्शन को इस मान का उपयोग नहीं करना चाहिए।

उत्तर

10
func canFail() (card Card, err error) { 
    return card, errors.New("not yet implemented") 
} 

मैं इस बारे में सोच, अपने तीसरे exampe भी ठीक है। समझा नियम यह है कि जब कोई फ़ंक्शन कोई त्रुटि देता है, तो अन्य वापसी मानों पर सार्थक मूल्यों पर भरोसा नहीं किया जा सकता है जब तक दस्तावेज़ अन्यथा स्पष्ट रूप से समझाता न हो। तो यहां शायद एक अर्थहीन संरचना मूल्य लौटना ठीक है।

+2

के संबंध में थोड़ा अलग है यह एक सूचक को वापस करने के लिए बहुत ही मूर्ख है ताकि आप शून्य का उपयोग कर सकें। यह गलतियों से बचने में मदद करता है और जब आप नामित वापसी मूल्यों का उपयोग नहीं कर रहे हैं तो प्रारंभिक रिटर्न करना आसान होता है। –

+1

हालांकि यह निश्चित रूप से एक सूचक के बजाय शून्य वापस करने में सक्षम होने के लिए आसान है, मैं अकेले उस कारण के लिए पॉइंटर्स का उपयोग नहीं करता। तथ्य यह है कि एक गैर-शून्य त्रुटि लौटाई गई है, यह आपको बताने के लिए पर्याप्त है कि 'कार्ड' में डेटा का उपयोग न करें। आपको मूल्य के बजाय त्रुटि की जांच करनी चाहिए। अन्यथा एक त्रुटि वापस करने में थोड़ा सा बिंदु है ... – weberc2

5

उदाहरण के लिए,

type Card struct { 
} 

func canFail() (card Card, err error) { 
    return Card{}, errors.New("not yet implemented") 
} 
+2

इस उदाहरण में वापसी मूल्यों का नाम भी नहीं होना चाहिए। (आप अभी भी उन्हें अन्य कारणों से नामित करना चाहते हैं, या आप महसूस कर सकते हैं कि फ़ंक्शन नामों के अव्यवस्था के बिना स्पष्ट है।) – Sonia

+0

प्रश्न और मेरा उत्तर पढ़ें। यह बाद में लागू करने के लिए एक स्टब फ़ंक्शन है - खाली 'संरचना' और '" अभी तक कार्यान्वित नहीं किया गया "संदेश। चूंकि हमें पता नहीं है कि फ़ंक्शन को लागू करने के लिए किस कोड का उपयोग किया जाएगा, एकमात्र सुरक्षित तरीका अच्छी तरह परिभाषित मूल्यों को वापस करना है जो बाद में कोड का उपयोग किया जाता है। – peterSO

5
func canFail() (card Card, err error) { 
     if somethingWrong { 
       err = errors.New("Not yet implemented") 
       return 
     } 

     if foo { 
       card = baz 
       return 
     } 

     ... 

     // or 
     return Card{Ace, Spades}, nil 
} 
+0

धन्यवाद, इसलिए यह मेरे आखिरी समाधान के करीब है, हालांकि सिंटैक्स – Fabien

2

संरचना को वापस करने के संभावित विकल्प के रूप में आप कॉलर को आवंटित करने और फ़ंक्शन सेट पैरा को आवंटित करने पर विचार कर सकते हैं।

func canFail(card *Card) (err error) { 
    if someCondition { 
     // set one property 
     card.Suit = Diamond 

     // set all at once 
     *card = Card{Ace, Spade} 
    } else { 
     err = errors.New("something went wrong") 
    } 

    return 
} 

आप आरामदायक नाटक है कि जाओ C++ शैली संदर्भ आप भी nil होने के लिए card की जाँच करनी चाहिए समर्थन करता है, नहीं कर रहे हैं।

https://play.golang.org/p/o-2TYwWCTL

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

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