Go में INT_MAX क्यों नहीं है और यह प्रदर्शन को कैसे प्रभावित करता है

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

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

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

विरोधाभास: Go में INT_MAX नहीं है, लेकिन यह कोई समस्या नहीं है

\n\n

यदि आप C++, Java या Python की दुनिया से Go में आए हैं, तो आपने निश्चित रूप से ऐसी स्थिति का सामना किया होगा जहाँ आपको किसी पूर्णांक का अधिकतम मान जानने की आवश्यकता होती है। C++ में INT_MAX है, Python में सीमाएँ गतिशील हैं, और Go में... आपके लिए एक आश्चर्य है। मानक लाइब्रेरी में सामान्य int प्रकार के लिए IntMax या MaxInt जैसा कोई स्थिरांक नहीं है। और यह कोई बग नहीं, बल्कि एक विशेषता है जो सीधे आपके कोड के प्रदर्शन को प्रभावित करती है।

\n\n

Stack Overflow पर "The maximum value for an int type in Go" प्रश्न ने हज़ारों बार देखा गया है। डेवलपर्स उत्तर खोजते हैं, लेकिन अक्सर यह नहीं समझ पाते कि Go को ऐसा क्यों डिज़ाइन किया गया है। आइए इसे एक बार और हमेशा के लिए समझ लें, और साथ ही यह भी जानें कि पूर्णांकों की सीमाओं का ज्ञान तेज़ और सुरक्षित प्रोग्राम लिखने में कैसे मदद करता है।

\n\n

संक्षिप्त उत्तर: Go में int के लिए अधिकतम मान कैसे प्राप्त करें

\n\n

यदि आपको केवल संख्या चाहिए - तो math पैकेज से स्थिरांक का उपयोग करें:

\n\n
package main\n\nimport (\n    "fmt"\n    "math"\n)\n\nfunc main() {\n    // int32 और int64 के लिए सब कुछ सरल है\n    fmt.Println("Max int32:", math.MaxInt32)   // 2147483647\n    fmt.Println("Min int32:", math.MinInt32)   // -2147483648\n    fmt.Println("Max int64:", math.MaxInt64)   // 9223372036854775807\n    fmt.Println("Min int64:", math.MinInt64)   // -9223372036854775808\n\n    // और सामान्य int के बारे में क्या?\n    // कोई math.MaxInt स्थिरांक नहीं है!\n}
\n\n

देखा? int32 और int64 के लिए स्थिरांक हैं, लेकिन int के लिए नहीं। क्यों? क्योंकि int एक प्लेटफ़ॉर्म-निर्भर प्रकार है। 32-बिट सिस्टम पर यह int32 के बराबर है, 64-बिट पर - int64 के बराबर। एक एकल स्थिरांक बनाने का मतलब प्लेटफ़ॉर्म एब्स्ट्रैक्शन को तोड़ना होगा। Go स्पष्टता पसंद करता है।

\n\n

आलसी लोगों के लिए हैक: फ्लाई पर MaxInt की गणना करें

\n\n

लेकिन अगर आपको वास्तव में इसकी आवश्यकता है, तो आप प्रोग्रामेटिक रूप से अधिकतम मान की गणना कर सकते हैं (हालाँकि इसे खराब अभ्यास माना जाता है):

\n\n
package main\n\nimport (\n    "fmt"\n    "math"\n)\n\nfunc main() {\n    // हैक: बिट शिफ्ट का उपयोग करें\n    const MaxUint = ^uint(0)\n    const MaxInt = int(MaxUint >> 1)\n    const MinInt = -MaxInt - 1\n\n    fmt.Println("Max int:", MaxInt)   // 9223372036854775807 (64-bit पर)\n    fmt.Println("Min int:", MinInt)   // -9223372036854775808\n\n    // जाँच करें: क्या यह math.MaxInt64 से मेल खाता है?\n    fmt.Println("बराबर हैं?", MaxInt == math.MaxInt64) // 64-bit पर true\n}
\n\n

यह इस तरह काम करता है: ^uint(0) एक संख्या देता है जिसमें सभी बिट 1 होते हैं (uint के लिए अधिकतम)। एक बिट दाईं ओर शिफ्ट करने से यह int के लिए अधिकतम मान में बदल जाता है (साइन बिट हटा देता है)।

\n\n

यह प्रदर्शन के लिए क्यों महत्वपूर्ण है?

\n\n

अब आइए सबसे दिलचस्प भाग पर आते हैं - अनुकूलन। Go में पूर्णांकों की सीमाओं का ज्ञान तब महत्वपूर्ण होता है जब आप उच्च-लोड कोड लिख रहे होते हैं। यहाँ तीन परिदृश्य हैं जहाँ यह प्रकट होता है।

\n\n

1. ओवरफ़्लो की अनावश्यक जाँच से बचना

\n\n

Go integer overflow (पूर्णांक ओवरफ़्लो) पर panic उत्पन्न नहीं करता है - मान बस "लपेट" जाता है। यह प्रदर्शन के लिए जानबूझकर किया गया है। लेकिन यदि आप सीमाएँ नहीं जानते हैं, तो आपको एक बग मिल सकता है जिसे पकड़ना मुश्किल है।

\n\n
package main\n\nimport "fmt"\n\nfunc main() {\n    var a int8 = 127\n    a++\n    fmt.Println(a) // -128 — बिना त्रुटि के ओवरफ़्लो!\n\n    // यदि आप एक काउंटर लिख रहे हैं, तो सीमाओं को नियंत्रित करें\n    for i := 0; i < 1000; i++ {\n        // यदि i int8 है, तो यह एक अनंत लूप होगा (ओवरफ़्लो)\n    }\n}
\n\n

अनुकूलन के लिए सुझाव: यदि आप निश्चित रूप से जानते हैं कि मान math.MaxInt32 से अधिक नहीं होगा, तो int के बजाय int32 का उपयोग करें। 64-बिट सिस्टम पर यह स्लाइस और स्ट्रक्चर में मेमोरी बचा सकता है, और 32-बिट पर - अंकगणित को गति दे सकता है।

\n\n

2. बेंचमार्क: 64-बिट पर int बनाम int32

ब्लॉग

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