Go के लिए multierr: कई एरर को जोड़ना और उनके साथ काम करना
Go में एरर हैंडलिंग डेवलपमेंट का एक स्पष्ट और अभिन्न हिस्सा है। लेकिन अक्सर ऐसी स्थिति आती है जब एक ऑपरेशन के दौरान एक नहीं, बल्कि कई एरर हो सकती हैं। उदाहरण के लिए, फाइलों की बैच प्रोसेसिंग, जटिल डेटा स्ट्रक्चर की वैलिडेशन, या पैरेलल टास्क को एक्जीक्यूट करते समय। स्टैंडर्ड errors पैकेज एक बार में केवल एक एरर के साथ काम करने की अनुमति देता है, जिससे सभी खराबियों को इकट्ठा करना और उनका विश्लेषण करना मुश्किल हो जाता है।
Uber कंपनी की multierr लाइब्रेरी (हाँ, वही जिसने zap और fx बनाया) इस समस्या को सुंदर और प्रभावी ढंग से हल करती है। यह कई स्वतंत्र एरर को एक कम्पोजिट (composite) एरर में जोड़ने के लिए एक सरल API प्रदान करती है। यह आपको सभी खराबियों का संदर्भ बनाए रखने, जानकारी खोए बिना, और उन्हें एक ही स्थान पर प्रोसेस करने की अनुमति देता है। एरर के स्लाइस मैन्युअली बनाने के विपरीत, multierr कॉम्बिनेशन, एरर की जाँच और उन पर इटरेशन के लिए सुविधाजनक फंक्शन प्रदान करता है।
लाइब्रेरी का मुख्य दर्शन सरलता और प्रदर्शन है। यह जरूरत न होने पर हीप में अनावश्यक एलोकेशन नहीं बनाती है और ओवरहेड को कम करने की कोशिश करती है। multierr उन मामलों के लिए आदर्श है जब आपको विभिन्न स्रोतों (जैसे, गोरूटीन) से एरर इकट्ठा करनी हो और उन्हें एक एकल परिणाम के रूप में वापस करना हो, जिसे स्टैंडर्ड if err != nil के साथ जाँचा जा सके।
इंस्टॉलेशन
लाइब्रेरी को इंस्टॉल करने के लिए स्टैंडर्ड go get कमांड का उपयोग करें। सुनिश्चित करें कि आपके पास Go का वर्जन 1.13 या उससे ऊपर है (errors.Is और errors.As के सपोर्ट के लिए)।
go get go.uber.org/multierr
कमांड चलाने के बाद, लाइब्रेरी आपकी go.mod फाइल में जुड़ जाएगी। इसे इस प्रकार इम्पोर्ट किया जाता है:
import "go.uber.org/multierr"
त्वरित शुरुआत: न्यूनतम उदाहरण
आइए सबसे सरल मामले पर विचार करें: हमारे पास दो फंक्शन हैं जो एरर लौटा सकते हैं। हम दोनों को एक्जीक्यूट करना चाहते हैं और यदि उनमें से कम से कम एक विफल होता है, तो एक सामान्य एरर लौटाना चाहते हैं।
package main
import (
"errors"
"fmt"
"go.uber.org/multierr"
)
func doSomething() error {
return errors.New("पहली एरर")
}
func doAnotherThing() error {
return errors.New("दूसरी एरर")
}
func main() {
var err error
// पहला ऑपरेशन करें
err = multierr.Append(err, doSomething())
// दूसरा ऑपरेशन करें
err = multierr.Append(err, doAnotherThing())
if err != nil {
fmt.Println("एरर हुईं:")
// सभी एरर को नई लाइन से अलग करके प्रिंट करें
for _, e := range multierr.Errors(err) {
fmt.Println("-", e)
}
}
}
इस उदाहरण में, multierr.Append मौजूदा एरर में एक नई एरर जोड़ता है। यदि err nil है, तो फंक्शन बस नई एरर लौटाता है। परिणामस्वरूप, हमें एक कम्पोजिट एरर मिलती है जिसे multierr.Errors की मदद से भागों में विभाजित किया जा सकता है।
मुख्य फंक्शन और तरीके
multierr लाइब्रेरी फंक्शन का एक छोटा लेकिन बहुत शक्तिशाली सेट प्रदान करती है। आइए प्रत्येक को विस्तार से देखें।
1. multierr.Append
सिग्नेचर: func Append(left error, right error) error
विवरण: यह दो एरर को जोड़ने का मुख्य फंक्शन है। यदि दोनों एरर nil हैं, तो nil लौटाता है। यदि उनमें से एक nil है, तो दूसरी लौटाता है। यदि दोनों nil नहीं हैं, तो वे एक कम्पोजिट एरर में जुड़ जाती हैं।
err1 := errors.New("एरर 1")
err2 := e