मॉड्यूल पाठ (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बनाता है।
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 errorPrint और 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 के अंदर)। |
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।
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 इस पर चल सकें।
if _, err := os.Open(path); err != nil {
return fmt.Errorf("read config %q: %w", path, err)
}%w के बजाय %v का उपयोग करने से त्रुटि संदेश प्रिंट हो जाता है लेकिन श्रृंखला टूट जाती है: कोई अनरैप नहीं, कोई errors.Is नहीं। नियम: यदि आप चाहते हैं कि कॉल करने वाला त्रुटि के प्रकार या पहचान को पहचानने में सक्षम हो, तो %w (प्रत्येक Errorf के लिए केवल एक) का उपयोग करें।
अभ्यास
पूर्णांक 42 से स्ट्रिंग '[42]' को प्रारूपित करने के लिए fmt.Sprintf का उपयोग करें, फिर इसे प्रिंट करें।
3 प्रयासों के बाद समाधान उपलब्ध है
struct p को क्रिया %+v के साथ प्रिंट करें (इसमें फ़ील्ड नाम शामिल होने चाहिए)।
3 प्रयासों के बाद समाधान उपलब्ध है
fmt.Errorf में प्रयुक्त कौन सी क्रिया, error.Is/As के लिए त्रुटि श्रृंखला को सुरक्षित रखती है?
err := fmt.Errorf("read %q: ???", path, base)