مرکزی مواد پر جائیں
ماڈیول 8 · سبق 1 از 5کورس میں 36/50~10 min
ماڈیول اسباق (1/5)

اعلی درجے کی `fmt`

fmt پیکیج Go میں تمام متنی 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 IN_CTED_20 کے لئے PROTECTED_INLINE_20__ کی پیروی نہیں کرتا ہے۔

اہم فعل

فعلیہ کیا کرتا ہے
%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 میں استعمال ہونے والا کون سا فعل errors.Is/As کے لیے ایرر چین کو محفوظ رکھتا ہے؟

Go
err := fmt.Errorf("read %q: ???", path, base)
جواب کے اختیارات