Go में मानक इनपुट से कैसे पढ़ें: शुरुआत से विशेषज्ञ तक
\n\nक्या आपने कभी सोचा है कि अपने Go प्रोग्राम को उपयोगकर्ता को "सुनने" के लिए कैसे बनाएं? एक ऐसी उपयोगिता कैसे लिखें जो कंसोल से कमांड स्वीकार करे, या एक इंटरैक्टिव CLI टूल? यदि हाँ, तो आप सही जगह पर आए हैं। आज हम Go में मानक इनपुट (stdin) से पढ़ना विस्तार से समझेंगे — जितना संभव हो उतना विस्तार से।
\n\nयह विषय Stack Overflow पर एक वास्तविक हिट है। प्रश्न "How can I read from standard input in the console?" ने हजारों व्यूज एकत्र किए हैं। और यह सही भी है: मानक इनपुट एक आधार है, जिसके बिना Go में कोई भी गंभीर प्रोजेक्ट नहीं चल सकता। हम इस प्रश्न को हिंदी भाषी दर्शकों के लिए अनुकूलित करेंगे और इसे एक पूर्ण ट्यूटोरियल में बदल देंगे।
\n\nइस लेख में आप जानेंगे:
\n- \n
os.Stdinक्या है और इसके साथ कैसे काम करें \n - पंक्ति-दर-पंक्ति पढ़ने के लिए
bufio.Scannerका उपयोग कैसे करें \n - क्यों
fmt.Scanएक दोधारी तलवार है \n - stdin से पूरी फ़ाइलें कैसे पढ़ें \n
- त्रुटि प्रबंधन और प्रदर्शन के रहस्य \n
चलिए शुरू करते हैं!
\n\nstdin क्या है और Go में इसकी आवश्यकता क्यों है?
\n\nमानक इनपुट (stdin) एक डेटा स्ट्रीम है जो आपका प्रोग्राम कंसोल या किसी अन्य प्रक्रिया से प्राप्त करता है। Go में, इसे *os.File प्रकार के वेरिएबल os.Stdin द्वारा दर्शाया जाता है। यह वह द्वार है जिसके माध्यम से डेटा आपके प्रोग्राम में प्रवेश करता है।
इसकी आवश्यकता क्यों है? कल्पना करें:
\n- \n
- आप एक CLI उपयोगिता लिख रहे हैं जो उपयोगकर्ता इनपुट को संसाधित करती है \n
- आप एक लॉग पार्सर बना रहे हैं जो पाइप के माध्यम से डेटा पढ़ता है (
cat log.txt | myapp) \n - आपको संकेतों के साथ इंटरैक्टिव इनपुट लागू करने की आवश्यकता है \n
Go, सिस्टम प्रोग्रामिंग की भाषा होने के नाते, stdin के साथ काम करने के लिए सुरुचिपूर्ण उपकरण प्रदान करता है। आइए उन्हें क्रम से समझें।
\n\nविधि 1: bufio.Scanner — पंक्ति-दर-पंक्ति पढ़ने का राजा
\n\nGo में stdin से पढ़ने का सबसे लोकप्रिय और अनुशंसित तरीका bufio.Scanner है। यह सरल, कुशल है और 90% कार्यों को हल करता है।
यहाँ एक क्लासिक उदाहरण है:
\n\npackage main\n\nimport (\n "bufio"\n "fmt"\n "os"\n)\n\nfunc main() {\n scanner := bufio.NewScanner(os.Stdin)\n fmt.Println("टेक्स्ट दर्ज करें (समाप्त करने के लिए Ctrl+D):")\n \n for scanner.Scan() {\n line := scanner.Text()\n fmt.Println("आपने दर्ज किया:", line)\n }\n \n if err := scanner.Err(); err != nil {\n fmt.Fprintln(os.Stderr, "पढ़ने में त्रुटि:", err)\n }\n}\n\nयह कैसे काम करता है?
\n- \n
bufio.NewScanner(os.Stdin)— एक स्कैनर बनाता है जो मानक इनपुट से पढ़ता है \n scanner.Scan()—trueलौटाता है जब तक डेटा है (डिफ़ॉल्ट रूप से नई पंक्ति वर्ण तक) \n scanner.Text()—\\nवर्ण के बिना वर्तमान पंक्ति लौटाता है \n - लूप
EOFपर समाप्त होता है (Linux/Mac में Ctrl+D, Windows में Ctrl+Z) \n
यह कोड किसी भी Go कंसोल इनपुट का आधार है। यह पाइप और इंटरैक्टिव इनपुट दोनों के साथ बढ़िया काम करता है।
\n\nScanner का अनुकूलन
\n\nडिफ़ॉल्ट रूप से, Scanner इनपुट को पंक्तियों में विभाजित करता है। लेकिन आप इसे बदल सकते हैं:
// शब्दों द्वारा पढ़ना\nscanner.Split(bufio.ScanWords)\n\n// बाइट्स द्वारा पढ़ना\nscanner.Split(bufio.ScanBytes)\n\n// वर्णों (रून्स) द्वारा पढ़ना\nscanner.Split(bufio.ScanRunes)\n\nऔर आप अपना स्वयं का स्प्लिटर भी सेट कर सकते हैं — उदाहरण के लिए, CSV या कस्टम विभाजकों के लिए। लेकिन यह एक अलग लेख का विषय है।
\n\nविधि 2: fmt.Scan — तेज़ और गंदा
\n\nयदि आपको एक मान दर्ज करना है — एक संख्या, एक स्ट्रिंग या कई वेरिएबल — तो fmt.Scan काम आता है। यह C में scanf की तरह है, बस