تنسيق السلاسل النصية في Go بدون طباعة: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا تنسيق سلسلة نصية إذا لم تكن بحاجة للطباعة؟



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



هذا السؤال يقلق آلاف المطورين، وليس بدون سبب - فقد حصل على عشرات الآلاف من المشاهدات على Stack Overflow. في هذه المقالة، سنشرح كيفية تنسيق السلاسل النصية في Go بدون طباعة، باستخدام أمثلة كود عملية. ستتعرف على الأداة القوية fmt.Sprintf، والأساليب الحديثة مع strings.Builder، و bytes.Buffer منخفض المستوى. هيا بنا!



المشكلة: Printf تطبع، لكني أحتاج إلى الحفظ



في Go، توجد دالة رائعة fmt.Printf تقوم بتنسيق السلسلة النصية وطباعتها فورًا في تيار الإخراج القياسي. ولكن ماذا لو كنت تريد الحصول على السلسلة النصية المنسقة كقيمة، وليس كأثر جانبي؟ على سبيل المثال:



name := "أليس"age := 30// أريد الحصول على السلسلة "اسمي أليس، عمري 30 سنة"// ولكن بدون طباعتها فورًا


غالبًا ما يكتب المطورون المبتدئون بهذه الطريقة:



fmt.Printf("اسمي %s، عمري %d سنة", name, age)// تمت طباعة السلسلة، لكننا فقدناها!


هذا يعمل، لكن النتيجة تذهب إلى وحدة التحكم. ونحن بحاجة إلى حفظها في متغير لمزيد من المعالجة. يوجد حل، وهو أنيق.



الحل رقم 1: fmt.Sprintf - ملك التنسيق



في حزمة fmt، توجد دالة توأم لـ Printf تسمى Sprintf. الحرف "S" في البداية يعني "String" - فهي تُرجع سلسلة نصية، ولا تطبعها. هذه هي الطريقة الأكثر مباشرة ووضوحًا لتنسيق السلاسل النصية في Go بدون طباعة.



مثال أساسي مع Sprintf



package main

import ( "fmt")

func main() { name := "بوب" age := 25 score := 98.5

// التنسيق بدون طباعة message := fmt.Sprintf("مرحبًا %s! عمرك %d سنة. نتيجتك: %.1f درجة.", name, age, score)

// الآن message تحتوي على السلسلة المنسقة fmt.Println(message) // نطبع الآن فقط}


الإخراج:

مرحبًا بوب! عمرك 25 سنة. نتيجتك: 98.5 درجة.


لاحظ: Sprintf تستخدم نفس العناصر النائبة ( %s، %d، %f ) التي تستخدمها Printf. الفرق الوحيد هو أن النتيجة تُعاد، ولا تُطبع.



العناصر النائبة المتقدمة



يمكنك استخدام جميع إمكانيات التنسيق في Go:



package main

import "fmt"

func main() { // محاذاة حسب العرض leftAligned := fmt.Sprintf("%-10s %d", "منتج", 10) rightAligned := fmt.Sprintf("%10s %d", "منتج", 10)

// تنسيق الأرقام price := 1234.5678 formattedPrice := fmt.Sprintf("السعر: $%.2f (مع الضريبة: $%.2f)", price, price*1.2)

// إخراج سداسي عشري hexValue := fmt.Sprintf("سداسي عشري: %x, عشري: %d", 255, 255)

fmt.Println(leftAligned) fmt.Println(rightAligned) fmt.Println(formattedPrice) fmt.Println(hexValue)}


الإخراج:

منتج      10      منتج 10السعر: $1234.57 (مع الضريبة: $1481.48)سداسي عشري: ff, عشري: 255


fmt.Sprintf هي أداتك الشاملة لتنسيق السلاسل النصية في Go. إنها تعمل بسرعة، وهي واضحة، وتغطي 90% من المهام.



الحل رقم 2: strings.Builder - للإنشاءات المعقدة



ماذا لو كنت بحاجة إلى تجميع سلسلة نصية من أجزاء متعددة، وإضافتها واحدة تلو الأخرى؟ على سبيل المثال، إنشاء HTML أو JSON أو استعلام SQL. استخدام Sprintf لكل جزء غير فعال - فستقوم بإنشاء

المدونات

توصيات الكتب