الانتقال إلى المحتوى الرئيسي
الوحدة 8 · الدرس 1 من 536/50 في الدورة~10 min
دروس الوحدة (1/5)

المتقدمة "FMT".

الحزمة fmt هي البوابة لجميع عمليات الإدخال/الإخراج النصية في Go. إن معرفة ذلك جيدًا يعني كتابة سجلات قابلة للقراءة، وأخطاء إعلامية، وتنسيق القيم بشكل اصطلاحي دون اللجوء إلى المكتبات الخارجية.

العائلات الأربع

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 يتبع التنسيق.

الأفعال الرئيسية

فعلماذا يفعل
محمي_INLINE_22القيمة الافتراضية (الاستدعاءات String() إذا تم تنفيذها).
محمي_INLINE_24هيكلة بـ أسماء الحقول.
محمي_INLINE_25بناء جملة Go (مفيد لتصحيح الأخطاء واللقطات).
محمي_INLINE_26النوع الديناميكي للقيمة.
محمي_INLINE_27عدد صحيح في الأساس 10.
محمي_INLINE_28ثنائي، ثماني، سداسي عشري (أحرف صغيرة/أحرف كبيرة).
محمي_INLINE_29النقطة العائمة: ثابتة، أسية، مدمجة.
محمي_INLINE_30السلسلة (أو error/Stringer).
محمي_INLINE_33سلسلة Go-style مقتبسة (متضمنة هروب).
محمي_INLINE_34حرف Unicode (rune).
محمي_INLINE_36المؤشر بالنظام الست عشري.
محمي_INLINE_37التفاف الخطأ (داخل 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 → الدقة رقمين عشريين.
  • محمي_INLINE_46 → العرض 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)
}

استخدام %v بدلاً من %w يطبع رسالة الخطأ ولكنه يقطع السلسلة: لا يوجد فك، لا errors.Is. القاعدة: إذا كنت تريد أن يتمكن المتصل من تمييز نوع الخطأ أو هويته، فاستخدم %w (واحد فقط لكل Errorf).

تمارين

تمرين#go.m8.l1.e1
المحاولات: 0جارٍ التحميل…

استخدم fmt.Sprintf لتنسيق السلسلة '[42]' من العدد الصحيح 42، ثم قم بطباعتها.

جارٍ تحميل المحرر…

الحل متاح بعد 3 من المحاولات

تمرين#go.m8.l1.e2
المحاولات: 0جارٍ التحميل…

اطبع البنية p مع الفعل %+v (يجب أن تتضمن أسماء الحقول).

جارٍ تحميل المحرر…

الحل متاح بعد 3 من المحاولات

Quiz#go.m8.l1.e3
جاهز

ما الفعل المستخدم في fmt.Errorf، الذي يحافظ على سلسلة الأخطاء للأخطاء.Is/As؟

Go
err := fmt.Errorf("read %q: ???", path, base)
خيارات الإجابة