مشكلة يعرفها كل مطور
\n\nتخيل: أنت تكتب محلل سجلات، أو تعالج إدخال مستخدم من نموذج، أو تحضر بيانات لواجهة API. السلاسل النصية تأتي مع مسافات زائدة في البداية والنهاية. إذا لم تقم بإزالتها — ستظهر أخطاء، مقارنات معطلة، JSON غير صحيح، وساعات ضائعة في التصحيح. هذه مهمة كلاسيكية حصدت آلاف المشاهدات على Stack Overflow. اليوم سنحلها باستخدام Go — بسرعة، بأناقة، وبدون مفاجآت.
\n\nفي هذا الدليل ستتعلم:
\n- \n
- كيفية استخدام المكتبة القياسية
stringsلإزالة المسافات. \n - الفرق بين
TrimSpaceوTrimLeftوTrimRight. \n - كيفية كتابة دالة مخصصة للأحرف البيضاء غير القياسية. \n
- كيف تتجنب المشاكل مع Unicode وعلامات التبويب. \n
هيا بنا!
\n\nبداية سريعة: strings.TrimSpace
\n\nأبسط وأشهر طريقة لإزالة المسافات من طرفي السلسلة النصية هي استخدام الدالة strings.TrimSpace من الحزمة القياسية strings. تقوم بإزالة جميع الأحرف التي تعتبرها Go "مسافات بيضاء" (whitespace): المسافات العادية، علامات التبويب، أسطر جديدة، إرجاع العربة، وحتى علامات التبويب العمودية.
إليك كيف يبدو ذلك في الكود:
\n\npackage 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 يعرض السلسلة مع تسلسلات الهروب — وهذا مفيد للتصحيح لرؤية الأحرف المخفية.
متى تستخدم: في 90% من الحالات هذا كافٍ. إذا كنت تحتاج فقط "لتنظيف" السلسلة من الزوائد على الأطراف — استخدم TrimSpace.
ضبط دقيق: TrimLeft و TrimRight
\n\nأحياناً تحتاج لإزالة المسافات من اليسار فقط أو من اليمين فقط. لهذا يوجد في Go strings.TrimLeft و strings.TrimRight. لكن هناك فارق: هاتان الدالتان لا تعملان مع "الأحرف البيضاء" افتراضياً، بل مع مجموعة الأحرف التي تمررها.
مثال:
\n\npackage 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 ستبقى دون تغيير.
بديل TrimSpace لجانب واحد
\n\nإذا كنت تحتاج لإزالة جميع المسافات البيضاء من اليسار فقط أو اليمين فقط، ولكنك لا تريد تعداد جميع الأحرف، يمكنك كتابة دالة تغليف صغيرة:
\n\nfunc 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 بحيلة:
// إزالة من اليسار فقط: أولاً عكس، ثم 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