دروس الوحدة (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.
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 فقط). |
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.
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)
}استخدام %v بدلاً من %w يطبع رسالة الخطأ ولكنه يقطع السلسلة: لا يوجد فك، لا errors.Is. القاعدة: إذا كنت تريد أن يتمكن المتصل من تمييز نوع الخطأ أو هويته، فاستخدم %w (واحد فقط لكل Errorf).
تمارين
استخدم fmt.Sprintf لتنسيق السلسلة '[42]' من العدد الصحيح 42، ثم قم بطباعتها.
الحل متاح بعد 3 من المحاولات
اطبع البنية p مع الفعل %+v (يجب أن تتضمن أسماء الحقول).
الحل متاح بعد 3 من المحاولات
ما الفعل المستخدم في fmt.Errorf، الذي يحافظ على سلسلة الأخطاء للأخطاء.Is/As؟
err := fmt.Errorf("read %q: ???", path, base)