मुख्य सामग्री पर जाएं
मॉड्यूल 8 · पाठ 1 का 5पाठ्यक्रम में 36/50~10 min
मॉड्यूल पाठ (1/5)

उन्नत `एफएमटी`

fmt पैकेज गो में सभी टेक्स्टुअल I/O का प्रवेश द्वार है। इसे अच्छी तरह से जानने का अर्थ है पढ़ने योग्य लॉग लिखना, सूचनात्मक त्रुटियाँ, और बाहरी पुस्तकालयों का सहारा लिए बिना मुहावरेदार रूप से मूल्यों को स्वरूपित करना।

चार परिवार

fmt उपसर्ग द्वारा अलग-अलग चार परिवारों में कार्यों को उजागर करता है:

  • Print* → os.Stdout को लिखता है (Print, Println, Printf)।
  • Fprint* → किसी भी io.Writer (Fprintln(os.Stderr, ...), Fprintf(file, ...)) को लिखता है।
  • Sprint* → मुद्रण के बिना एक स्ट्रिंग लौटाता है (Sprintf, Sprintln)।
  • Errorf → एक स्वरूपित error बनाता है।
Go
fmt.Println("hello")                       // stdout
fmt.Fprintln(os.Stderr, "boom")            // stderr
s := fmt.Sprintf("[%d]", 42)               // "[42]"
err := fmt.Errorf("parse %q: %w", in, base) // wrapped error

Print और Println के बीच का अंतर केवल तर्कों और पिछली नई लाइन के बीच का अंतर है: Println हमेशा \n जोड़ता है, Print नहीं जोड़ता, Printf प्रारूप का अनुसरण करता है।

मुख्य क्रियाएँ

क्रियायह क्या करता है
%vडिफ़ॉल्ट मान (यदि लागू किया जाता है तो String() पर कॉल करता है)।
%+vफ़ील्ड नाम के साथ संरचना।
%#vसिंटैक्स पर जाएं (डीबगिंग और स्नैपशॉट के लिए उपयोगी)।
%Tमान का गतिशील प्रकार.
%dआधार 10 में पूर्णांक
%b %o %x %Xबाइनरी, ऑक्टल, हेक्साडेसिमल (लोअरकेस/अपरकेस)।
%f %e %gफ़्लोटिंग पॉइंट: निश्चित, घातीय, कॉम्पैक्ट।
%sस्ट्रिंग (या error/Stringer)।
%qगो-शैली उद्धृत स्ट्रिंग (एस्केप शामिल)।
%cयूनिकोड वर्ण (rune).
%pहेक्साडेसिमल में सूचक.
%wत्रुटि रैप (केवल Errorf के अंदर)।
Go
type Point struct{ X, Y int }
p := Point{1, 2}
fmt.Printf("%v\n", p)   // {1 2}
fmt.Printf("%+v\n", p)  // {X:1 Y:2}
fmt.Printf("%#v\n", p)  // main.Point{X:1, Y:2}
fmt.Printf("%T\n", p)   // main.Point

चौड़ाई, परिशुद्धता, झंडे

संख्यात्मक और स्ट्रिंग क्रियाएं चौड़ाई और सटीकता स्वीकार करती हैं:

  • %6d → न्यूनतम चौड़ाई 6, रिक्त स्थान के साथ बाएँ पैडिंग।
  • %-6d → चौड़ाई 6, दायां पैडिंग (ध्वज -)।
  • %06d → चौड़ाई 6, 0 (ध्वज 0) के साथ पैडिंग।
  • %.2f → परिशुद्धता 2 दशमलव अंक।
  • %8.2f → चौड़ाई 8, परिशुद्धता 2।
Go
fmt.Printf("|%6d|\n", 42)    // |    42|
fmt.Printf("|%-6d|\n", 42)   // |42    |
fmt.Printf("|%06d|\n", 42)   // |000042|
fmt.Printf("|%8.2f|\n", 3.14)// |    3.14|

संरेखित तालिकाओं के लिए, टेक्स्ट कॉलम के लिए निश्चित चौड़ाई + %-...s text/tabwriter पर जाने से पहले सबसे सरल पैटर्न है।

%w और त्रुटि रैपिंग

%w विशेष है: यह केवल fmt.Errorf के अंदर काम करता है और श्रृंखला में मूल त्रुटि को संरक्षित करता है, ताकि errors.Is और errors.As इस पर चल सकें।

Go
if _, err := os.Open(path); err != nil {
    return fmt.Errorf("read config %q: %w", path, err)
}

%w के बजाय %v का उपयोग करने से त्रुटि संदेश प्रिंट हो जाता है लेकिन श्रृंखला टूट जाती है: कोई अनरैप नहीं, कोई errors.Is नहीं। नियम: यदि आप चाहते हैं कि कॉल करने वाला त्रुटि के प्रकार या पहचान को पहचानने में सक्षम हो, तो %w (प्रत्येक Errorf के लिए केवल एक) का उपयोग करें।

अभ्यास

व्यायाम#go.m8.l1.e1
प्रयास: 0लोड हो रहा है...

पूर्णांक 42 से स्ट्रिंग '[42]' को प्रारूपित करने के लिए fmt.Sprintf का उपयोग करें, फिर इसे प्रिंट करें।

संपादक लोड हो रहा है...

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#go.m8.l1.e2
प्रयास: 0लोड हो रहा है...

struct p को क्रिया %+v के साथ प्रिंट करें (इसमें फ़ील्ड नाम शामिल होने चाहिए)।

संपादक लोड हो रहा है...

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m8.l1.e3
तैयार

fmt.Errorf में प्रयुक्त कौन सी क्रिया, error.Is/As के लिए त्रुटि श्रृंखला को सुरक्षित रखती है?

Go
err := fmt.Errorf("read %q: ???", path, base)
उत्तर विकल्प