CLI-उपयोगिताओं के लिए Go आदर्श भाषा क्यों है?
\n\nकल्पना करें: आपको एक ऐसा टूल लिखना है जो कंसोल में चलेगा, फ़ाइलों को प्रोसेस करेगा, API पर जाएगा या बस रूटीन को ऑटोमेट करेगा। आप Python, Node.js या Bash चुन सकते हैं। लेकिन अगर गति, बाइनरी का आकार और वितरण में आसानी महत्वपूर्ण है — तो आपकी पसंद Go में CLI उपयोगिताएँ होनी चाहिए।
\n\nGo एक स्थिर बाइनरी में कंपाइल होता है। कोई डिपेंडेंसी नहीं, कोई "क्या आपके पास Python 3.8 है?" नहीं। डाउनलोड किया — चलाया। यह Golang CLI टूल्स को DevOps की दुनिया में डी-फैक्टो मानक बनाता है (Docker, Kubernetes, Hugo को याद करें — ये सभी Go में लिखे गए हैं)।
\n\nइस लेख में हम सिर्फ़ थ्योरी पर बात नहीं करेंगे। हम शुरू से एक वास्तविक Go में कंसोल उपयोगिता बनाएंगे जो JSON पार्स करेगी, HTTP के साथ काम करेगी और सुंदर टेबल प्रदर्शित करेगी। आप सीखेंगे कि प्रोजेक्ट को कैसे स्ट्रक्चर करें, एरर को कैसे हैंडल करें और किसी भी प्लेटफ़ॉर्म के लिए कंपाइल कैसे करें।
\n\nएनवायरनमेंट सेटअप और प्रोजेक्ट स्ट्रक्चर
\n\nकोड लिखने से पहले, सुनिश्चित करें कि आपके पास Go (वर्जन 1.21+) इंस्टॉल है। जाँच करना आसान है:
\n\ngo version\n\nअपने प्रोजेक्ट के लिए एक डायरेक्टरी बनाएँ। उपयोगिता का नाम json2table रखें — यह stdin या फ़ाइल से JSON पढ़ेगी और डेटा को टेबल के रूप में प्रदर्शित करेगी।
mkdir json2table\ncd json2table\ngo mod init github.com/आपका-यूज़रनेम/json2table\n\nप्रोजेक्ट स्ट्रक्चर Go में डेवलपमेंट के लिए क्लासिक होगा:
\n\n- \n
main.go— एंट्री पॉइंट \n internal/— आंतरिक लॉजिक (पार्सिंग, आउटपुट) \n cmd/— कमांड हैंडलिंग के लिए कोड (यदि Cobra का उपयोग करते हैं) \n
हम बिना फ्रेमवर्क के सरल शुरुआत करेंगे, और बाद में फ्लैग और हेल्प जोड़ेंगे।
\n\nउपयोगिता का कोर लिखना: JSON पार्सिंग और टेबल आउटपुट
\n\nफ़ाइल internal/parser.go बनाएँ। यहाँ हम JSON को पार्स करेंगे और इसे स्ट्रक्चर में बदलेंगे।
package internal\n\nimport (\n "encoding/json"\n "fmt"\n "io"\n)\n\n// Record एक टेबल की एक पंक्ति को दर्शाता है\ntype Record map[string]interface{}\n\n// ParseJSON reader से JSON पढ़ता है और रिकॉर्ड का स्लाइस लौटाता है\nfunc ParseJSON(r io.Reader) ([]Record, error) {\n var data []Record\n decoder := json.NewDecoder(r)\n if err := decoder.Decode(&data); err != nil {\n return nil, fmt.Errorf("JSON पार्सिंग में त्रुटि: %w", err)\n }\n return data, nil\n}\n\nअब फ़ॉर्मेटेड आउटपुट के लिए internal/table.go बनाएँ:
package internal\n\nimport (\n "fmt"\n "strings"\n "text/tabwriter"\n "os"\n)\n\n// PrintTable रिकॉर्ड को संरेखण के साथ टेबल के रूप में प्रदर्शित करता है\nfunc PrintTable(records []Record) {\n if len(records) == 0 {\n fmt.Println("प्रदर्शित करने के लिए कोई डेटा नहीं")\n return\n }\n\n // सभी अद्वितीय कुंजियाँ (कॉलम हेडर) इकट्ठा करें\n headers := make([]string, 0)\n seen := make(map[string]bool)\n for _, rec := range records {\n for key := range rec {\n if !seen[key] {\n headers = append(headers, key)\n seen[key] = true\n }\n }\n }\n\n // सुंदर आउटपुट के लिए tabwriter का उपयोग करें\n w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)\n\n // हेडर\n fmt.Fprintln(w, strings.Join(headers, "\\t"))\n\n // सेपरेटर\n sep := make([]string, len(headers))\n for i, h := range headers {\n sep[i] = strings.Repeat("-", len(h))\n }\n fmt.Fprintln(w, strings.Join(sep, "\\t"))\n\n // डेटा\n for _, rec := range records {\n row := make([]string, len(headers))\n for i, h := range headers {\n if val, ok := rec[h]; ok {\n row[i] = fmt.Sprintf("%v", val)\n } else {\n row[i] = ""\n }\n }\n fmt.Fprintln(w, strings.Join(row, "\\t"))\n }\n\n w.Flush()\n}\n\n