«Convert string to integer type in Go?» — سؤال يقلق المبتدئين
\n\nكل من بدأ البرمجة بلغة Go، عاجلاً أم آجلاً، يصطدم بجدار: تحتاج إلى أخذ سلسلة نصية مثل "42" وتحويلها إلى رقم صحيح 42. قد يبدو الأمر بسيطاً، لكن هذا السؤال بالتحديد يجمع آلاف المشاهدات على Stack Overflow، وتحته عشرات التعليقات التي تحتوي على أخطاء نموذجية. لماذا يحدث هذا؟
في Go لا يوجد ما هو مألوف في Python أو JavaScript مثل int("42"). بدلاً من ذلك، هناك حزمة قوية ولكنها صارمة strconv، والتي تجعلك تفكر في ما قد يسير بشكل خاطئ. وهذا صحيح: لا يمكنك ببساطة «تمرير» سلسلة نصية إلى int، لأن السلسلة النصية قد تكون تالفة أو فارغة أو تحتوي على مسافات زائدة.
في هذه المقالة، سنحلل تحويل سلسلة نصية إلى رقم في Go بأمثلة حقيقية، وسنستعرض الأخطاء التي يقع فيها حتى المطورون ذوو الخبرة، وسنقدم أنماطاً عملية للكود. هيا بنا!
\n\n1. الأداة الرئيسية: حزمة strconv
\n\nفي المكتبة القياسية للغة Go، تتولى حزمة strconv مسؤولية تحويل السلاسل النصية. تحتوي على ثلاث دوال رئيسية لتحويل سلسلة نصية إلى عدد صحيح:
- \n
Atoi(s string) (int, error)— الخيار الأبسط، يحول السلسلة النصية إلىint(حسب المنصة: 32 أو 64 بت). \n ParseInt(s string, base int, bitSize int) (int64, error)— يمنحك تحكماً كاملاً: أساس نظام العد (10، 16، 2) وحجم البت (0، 8، 16، 32، 64). \n ParseUint(s string, base int, bitSize int) (uint64, error)— نفس الشيء، ولكن للأرقام غير الموقعة. \n
الخطأ الأكثر شيوعاً هو تجاهل الخطأ المرتجع. دعنا نرى إلى ماذا يؤدي هذا.
\n\nمثال 1: تجاهل الخطأ — نحصل على خلل
\n\npackage main\n\nimport (\n "fmt"\n "strconv"\n)\n\nfunc main() {\n s := "123abc"\n num, _ := strconv.Atoi(s) // تم ابتلاع الخطأ!\n fmt.Println(num) // الإخراج: 0 — ولن تعرف أبداً ما الخطأ\n}\n\n\nفي Go لا توجد استثناءات، الخطأ هو قيمة. إذا تجاهلته (_)، ستحصل على القيمة الصفرية (0) وستقضي ساعات في التصحيح، متسائلاً لماذا يتصرف برنامجك بشكل غريب. تعامل مع الخطأ دائماً!
2. أهم 5 أخطاء عند تحويل string إلى int في Golang
\n\nقمنا بتحليل الأسئلة على Stack Overflow واستخرجنا المشكلات الأكثر شيوعاً. ها هي:
\n\nالخطأ رقم 1: المسافات والأحرف غير المرئية
\n\nالسلسلة النصية " 42 " أو "42\\n" — سترجع Atoi خطأ. Go لا تتسامح مع الأحرف الزائدة، على عكس بعض اللغات التي تقوم تلقائياً بقص السلسلة النصية.
s := " 42 "\nnum, err := strconv.Atoi(s)\nif err != nil {\n fmt.Println("خطأ:", err) // strconv.Atoi: parsing " 42 ": invalid syntax\n}\n\n\nالحل: استخدم strings.TrimSpace() قبل التحويل.
import "strings"\n\ns := " 42 "\ns = strings.TrimSpace(s)\nnum, err := strconv.Atoi(s)\nif err == nil {\n fmt.Println(num) // 42\n}\n\n\nالخطأ رقم 2: سلسلة نصية فارغة
\n\nالسلسلة النصية الفارغة "" — هي أيضاً خطأ. يتوقع العديد من المبتدئين أن تتحول السلسلة الفارغة إلى 0، لكن هذا غير صحيح.
num, err := strconv.Atoi("")\n// err: strconv.Atoi: parsing "": invalid syntax\n\n\nالحل: تحقق من طول السلسلة النصية أو تعامل مع الخطأ بشكل صريح، مع تعيين قيمة افتراضية.
\n\nالخطأ رقم 3: تجاوز السعة (overflow)
\n\nإذا كانت السلسلة النصية تحتوي على رقم لا يسع النوع المختار، سترجع Atoi أو ParseInt خطأ ErrRange والقيمة القصوى/الدنيا لذلك النوع.
s := "99999999999999999999" // أكبر من int64\nnum, err := strconv.ParseInt(s, 10, 64)\nif er