Go में "struct को प्रिंट करना" इतना आसान क्यों नहीं है?
\n\nसोचिए: आप Go में कोड लिख रहे हैं, एक सुंदर User struct बनाया, उसमें डेटा भरा, और बस झलक देखना चाहते हैं कि अंदर क्या है। आप fmt.Println(user) लिखते हैं और कुछ ऐसा दिखता है {Alex 25 true}। जानकारीपूर्ण? बिल्कुल नहीं। अगर 15 फील्ड हों तो? अगर उनमें से एक नेस्टेड struct हो? अगर वह struct का slice हो?
Stack Overflow पर सवाल "How to print struct variables in console?" ने हज़ारों व्यूज़ बटोरे हैं, यह कोई संयोग नहीं है। हर शुरुआती (और सिर्फ शुरुआती ही नहीं) Golang में इस बात का सामना करता है कि struct का डिफ़ॉल्ट आउटपुट फील्ड नामों के बिना एक उबाऊ स्ट्रिंग होता है। और जब प्रोजेक्ट बड़ा होता है, तो डिबगिंग अंदाज़ा लगाने जैसी हो जाती है।
\n\nइस लेख में हम Go में struct को कंसोल पर प्रिंट करने के सभी तरीकों पर चर्चा करेंगे: बेसिक से लेकर एडवांस्ड तक। आप सीखेंगे कि struct को खूबसूरती से, फील्ड नामों के साथ, JSON के रूप में, और यहां तक कि अपना खुद का प्रिंट मेथड कैसे लिखें। चलिए शुरू करते हैं!
\n\n▎1. सबसे आसान तरीका: fmt.Println और इसकी सीमाएं
\n\nचलिए बुनियादी बातों से शुरू करते हैं। हमारे पास एक struct है:
\n\npackage main\n\nimport "fmt"\n\ntype User struct {\n Name string\n Age int\n Active bool\n}\n\nfunc main() {\n u := User{Name: "अन्ना", Age: 30, Active: true}\n fmt.Println(u)\n}\n\n\nआउटपुट:\n
{अन्ना 30 true}\n\nयह काम करता है, लेकिन जानकारीपूर्ण नहीं है। आप यह नहीं देख पाते कि कौन सा मान किस फील्ड का है। अगर struct में 10 फील्ड हों, तो आप अंदाज़ा लगाते रहेंगे कि क्या है। खासकर अगर डेटा टाइप दोहराया जाए (जैसे, लगातार दो string फील्ड)।
निष्कर्ष: fmt.Println केवल त्वरित जांच के लिए उपयुक्त है, जब struct छोटा हो और आपको फील्ड का क्रम याद हो।
यह कब उपयोगी है?
\n- \n
- आप एक बार उपयोग होने वाला स्क्रिप्ट लिख रहे हैं। \n
- struct में अलग-अलग टाइप के 2-3 फील्ड हैं। \n
- आप
fmt.Printlnका उपयोग लॉग के लिए कर रहे हैं, जहां गति महत्वपूर्ण है, पठनीयता नहीं। \n
▎2. जीवन रक्षक %+v: फील्ड नामों के साथ प्रिंट करें
\n\nयह शायद Stack Overflow पर सबसे लोकप्रिय जवाब है। fmt.Printf में %+v फॉर्मेट struct को फील्ड नामों के साथ प्रिंट करता है:
fmt.Printf("%+v\\n", u)\n\n\nआउटपुट:\n
{Name:अन्ना Age:30 Active:true}\n\nअब बहुत बेहतर है! आप स्पष्ट रूप से देख सकते हैं कि नाम, उम्र और स्थिति कहां है।
\n\nfmt के शस्त्रागार में और क्या है?
\n- \n
%v— मानक प्रतिनिधित्व (जैसे Println में)। \n %+v — फील्ड नामों के साथ।\n %#v— पैकेज और टाइप के साथ पूर्ण प्रतिनिधित्व (नीचे देखें)। \n %T— केवल वेरिएबल का टाइप प्रिंट करता है। \n
%#v का उदाहरण:
fmt.Printf("%#v\\n", u)\n// main.User{Name:"अन्ना", Age:30, Active:true}\n\n\nयह फॉर्मेट तब उपयोगी है जब आप आउटपुट को कॉपी करके वापस कोड में पेस्ट करना चाहते हैं — यह struct का एक वैध लिटरल इनिशियलाइज़ेशन है।
\n\nसुझाव: %+v कॉम्बिनेशन याद रखें — Go में struct डिबग करते समय यह आपकी रोटी है।
▎3. सुंदरता और व्यवस्था: JSON में सीरियलाइज़ेशन
\n\nजब struct बड़ा, नेस्टेड या इसमें slices हों, तो %+v अपठनीय हो सकता है। यहां JSON काम आता है। Go मानक रूप से struct को JSON में बदल सकता है:
package main\n\nimport (\n "encoding/json"\n "fmt"\n)\n\ntype Address struct {\n City string `json:"city"`\n Street string `json:"street"`\n}\n\ntype User struct {\n Name string `json:"name"`\n Age int `json:"age"`\n Active bool `json:"active"`\n Address Address `json:"address"`\n}\n\nfunc main() {\n u := User{\n Name: "इवान",\n Age: 28,\n Active: true,\n Address: Address{\n City: "मॉस्को",\n Street: "टावर्सकाया",\n }