Go में Generics: क्यों आवश्यक हैं और व्यवहार में कैसे उपयोग करें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: Go में Generics एक सफलता क्यों है?

\n\n

लंबे समय तक, Go भाषा (Golang) सामान्यीकृत प्रोग्रामिंग (generics) के समर्थन के बिना कुछ आधुनिक भाषाओं में से एक रही। डेवलपर्स को interface{} और टाइप कास्टिंग का उपयोग करने के लिए मजबूर होना पड़ता था, जिससे संकलन चरण में टाइप सुरक्षा का नुकसान होता था और कोड अव्यवस्थित हो जाता था। Go संस्करण 1.18 (फरवरी 2022) के आने से स्थिति में मौलिक परिवर्तन आया।

\n\n

Generics (जेनेरिक्स) एक तंत्र है जो फ़ंक्शन और डेटा संरचनाओं को लिखने की अनुमति देता है जो किसी भी प्रकार के साथ काम कर सकते हैं, सख्त टाइपिंग बनाए रखते हुए। इस लेख में, हम चर्चा करेंगे कि उनकी आवश्यकता क्यों है, और व्यावहारिक उदाहरणों के साथ दिखाएंगे कि Go में दैनिक विकास में उनका उपयोग कैसे करें।

\n\n

Go में Generics की आवश्यकता क्यों है?

\n\n

जेनेरिक्स के आगमन से पहले, सार्वभौमिक फ़ंक्शन बनाने के लिए डेवलपर्स interface{} (खाली इंटरफ़ेस) का उपयोग करते थे। एक क्लासिक उदाहरण पर विचार करें - एक फ़ंक्शन जो स्लाइस में न्यूनतम तत्व ढूंढता है:

\n\n
// जेनेरिक्स के बिना (Go < 1.18)\nfunc MinInt(a, b int) int {\n    if a < b {\n        return a\n    }\n    return b\n}\n\nfunc MinFloat(a, b float64) float64 {\n    if a < b {\n        return a\n    }\n    return b\n}
\n\n

प्रत्येक प्रकार के लिए एक अलग फ़ंक्शन लिखना पड़ता था। interface{} के साथ इसे इस प्रकार किया जा सकता था:

\n\n
func MinInterface(a, b interface{}) interface{} {\n    // टाइप कास्टिंग और रनटाइम पर जाँच की आवश्यकता है\n    // यह असुरक्षित और अकुशल है\n}
\n\n

इस दृष्टिकोण की समस्याएं स्पष्ट हैं:

\n
    \n
  • टाइप सुरक्षा का नुकसान - त्रुटि केवल रनटाइम के दौरान ही प्रकट हो सकती है।
  • \n
  • टाइप कास्टिंग की आवश्यकता - कोड बोझिल हो जाता है।
  • \n
  • प्रदर्शन में कमी - इंटरफ़ेस के साथ काम करने के लिए अतिरिक्त संचालन की आवश्यकता होती है।
  • \n
\n\n

Generics इन सभी समस्याओं का समाधान करते हैं। वे अनुमति देते हैं:

\n
    \n
  • सार्वभौमिक एल्गोरिदम को एक बार लिखना।
  • \n
  • संकलन चरण पर सख्त प्रकार की जाँच बनाए रखना।
  • \n
  • टाइप कास्टिंग से छुटकारा पाना और प्रदर्शन में सुधार करना।
  • \n
\n\n

Go में Generics सिंटैक्स की मूल बातें

\n\n

Go में जेनेरिक्स प्रकार मापदंडों पर आधारित हैं। सिंटैक्स सरल और सहज है। प्रकार मापदंडों को फ़ंक्शन या प्रकार के नाम के बाद वर्गाकार कोष्ठक में निर्दिष्ट किया जाता है।

\n\n

1. जेनेरिक्स के साथ एक सरल फ़ंक्शन

\n\n

आइए वही न्यूनतम फ़ंक्शन लिखें, लेकिन अब जेनेरिक्स का उपयोग करते हुए:

\n\n
package main\n\nimport "fmt"\n\n// Min दो में से न्यूनतम मान लौटाता है\nfunc Min[T comparable](a, b T) T {\n    if a < b {\n        return a\n    }\n    return b\n}\n\nfunc main() {\n    fmt.Println(Min[int](10, 20))       // 10\n    fmt.Println(Min[float64](3.14, 2.71)) // 2.71\n    fmt.Println(Min[string]("abc", "xyz")) // abc\n}
\n\n

यहाँ [T comparable] प्रकार का पैरामीटर है। comparable एक अंतर्निहित बाधा (constraint) है, जो गारंटी देता है कि प्रकार तुलना ऑपरेटरों == और != का समर्थन करता है। ध्यान दें: ऑपरेटर < के लिए, आपको बाधा constraints.Ordered (पैकेज golang.org/x/exp/constraints से) का उपयोग करना होगा या अपनी खुद की बाधा लिखनी होगी।

\n\n

2. बाधाएं (Constraints)

\n\n

बाधाएं इंटरफ़ेस हैं जो परिभाषित करती हैं कि प्रकारों को किन विधियों और संचालनों का समर्थन करना चाहिए। Go 1.18+ में, पैकेज constraints दिखाई दिया (अभी golang.org/x/exp में है), लेकिन आप अपनी खुद की बाधाएं बना सकते हैं।

\n\n
import "golang.org/x/exp/constraints"\n\n// MinOrdered केवल क्रमबद्ध प्रकारों के साथ काम करता है\nfunc MinOrdered[T constraints.Ordered](a, b T) T {\n    if a < b {\n        return a\n    }\n    return b\n}
\n\n

String() विधि का समर्थन करने वाले प्रकारों के लिए स्वयं की बाधा:

\n\n

ब्लॉग

पुस्तक अनुशंसाएँ