إزالة المسافات في Go: كيفية التخلص من الأحرف الزائدة في السلسلة النصية

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

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

ابدأ الدورة

مشكلة يعرفها كل مطور

\n\n

تخيل: أنت تكتب محلل سجلات، أو تعالج إدخال مستخدم من نموذج، أو تحضر بيانات لواجهة API. السلاسل النصية تأتي مع مسافات زائدة في البداية والنهاية. إذا لم تقم بإزالتها — ستظهر أخطاء، مقارنات معطلة، JSON غير صحيح، وساعات ضائعة في التصحيح. هذه مهمة كلاسيكية حصدت آلاف المشاهدات على Stack Overflow. اليوم سنحلها باستخدام Go — بسرعة، بأناقة، وبدون مفاجآت.

\n\n

في هذا الدليل ستتعلم:

\n
    \n
  • كيفية استخدام المكتبة القياسية strings لإزالة المسافات.
  • \n
  • الفرق بين TrimSpace و TrimLeft و TrimRight.
  • \n
  • كيفية كتابة دالة مخصصة للأحرف البيضاء غير القياسية.
  • \n
  • كيف تتجنب المشاكل مع Unicode وعلامات التبويب.
  • \n
\n\n

هيا بنا!

\n\n

بداية سريعة: strings.TrimSpace

\n\n

أبسط وأشهر طريقة لإزالة المسافات من طرفي السلسلة النصية هي استخدام الدالة strings.TrimSpace من الحزمة القياسية strings. تقوم بإزالة جميع الأحرف التي تعتبرها Go "مسافات بيضاء" (whitespace): المسافات العادية، علامات التبويب، أسطر جديدة، إرجاع العربة، وحتى علامات التبويب العمودية.

\n\n

إليك كيف يبدو ذلك في الكود:

\n\n
package main\n\nimport (\n    "fmt"\n    "strings"\n)\n\nfunc main() {\n    raw := "   مرحباً بالعالم!   \\n\\t"\n    cleaned := strings.TrimSpace(raw)\n    \n    fmt.Printf("الأصلية: %q\\n", raw)\n    fmt.Printf("المنظفة: %q\\n", cleaned)\n}\n
\n\n

النتيجة:

\n
الأصلية: "   مرحباً بالعالم!   \\n\\t"\nالمنظفة: "مرحباً بالعالم!"\n
\n\n

لاحظ: %q في fmt.Printf يعرض السلسلة مع تسلسلات الهروب — وهذا مفيد للتصحيح لرؤية الأحرف المخفية.

\n\n

متى تستخدم: في 90% من الحالات هذا كافٍ. إذا كنت تحتاج فقط "لتنظيف" السلسلة من الزوائد على الأطراف — استخدم TrimSpace.

\n\n

ضبط دقيق: TrimLeft و TrimRight

\n\n

أحياناً تحتاج لإزالة المسافات من اليسار فقط أو من اليمين فقط. لهذا يوجد في Go strings.TrimLeft و strings.TrimRight. لكن هناك فارق: هاتان الدالتان لا تعملان مع "الأحرف البيضاء" افتراضياً، بل مع مجموعة الأحرف التي تمررها.

\n\n

مثال:

\n\n
package main\n\nimport (\n    "fmt"\n    "strings"\n)\n\nfunc main() {\n    s := "   \\t\\n   Hello   "\n    \n    // إزالة من اليسار فقط (مسافات، علامات تبويب، أسطر جديدة)\n    left := strings.TrimLeft(s, " \\t\\n")\n    fmt.Printf("من اليسار: %q\\n", left)\n    \n    // إزالة من اليمين فقط (مسافات فقط)\n    right := strings.TrimRight(s, " ")\n    fmt.Printf("من اليمين: %q\\n", right)\n}\n
\n\n

النتيجة:

\n
من اليسار: "Hello   "\nمن اليمين: "   \\t\\n   Hello"\n
\n\n

مهم: TrimLeft و TrimRight تزيلان جميع الأحرف الموجودة في الوسيط الثاني، حتى تصل إلى حرف غير موجود فيه. إذا حددت مسافة فقط " "، فإن علامة التبويب \\t ستبقى دون تغيير.

\n\n

بديل TrimSpace لجانب واحد

\n\n

إذا كنت تحتاج لإزالة جميع المسافات البيضاء من اليسار فقط أو اليمين فقط، ولكنك لا تريد تعداد جميع الأحرف، يمكنك كتابة دالة تغليف صغيرة:

\n\n
func trimLeftSpace(s string) string {\n    return strings.TrimLeft(s, " \\t\\n\\r\\v\\f")\n}\n\nfunc trimRightSpace(s string) string {\n    return strings.TrimRight(s, " \\t\\n\\r\\v\\f")\n}\n
\n\n

أو، لمن يحبون الاختصار، استخدم strings.TrimSpace بحيلة:

\n\n
// إزالة من اليسار فقط: أولاً عكس، ثم TrimSpace، ثم عكس مرة أخرى\nfunc trimLeftSpace(s string) string {\n    runes := []rune(s)\n    for i, r := range runes {\n        if !unicode.IsSpace(r) {\n            return string(runes[i:])\n        }\n    }\n                

المدونات

توصيات الكتب