تحويل سلسلة نصية إلى رقم في Go: 5 أخطاء شائعة وحلولها

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

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

ابدأ الدورة

«Convert string to integer type in Go?» — سؤال يقلق المبتدئين

\n\n

كل من بدأ البرمجة بلغة Go، عاجلاً أم آجلاً، يصطدم بجدار: تحتاج إلى أخذ سلسلة نصية مثل "42" وتحويلها إلى رقم صحيح 42. قد يبدو الأمر بسيطاً، لكن هذا السؤال بالتحديد يجمع آلاف المشاهدات على Stack Overflow، وتحته عشرات التعليقات التي تحتوي على أخطاء نموذجية. لماذا يحدث هذا؟

\n\n

في Go لا يوجد ما هو مألوف في Python أو JavaScript مثل int("42"). بدلاً من ذلك، هناك حزمة قوية ولكنها صارمة strconv، والتي تجعلك تفكر في ما قد يسير بشكل خاطئ. وهذا صحيح: لا يمكنك ببساطة «تمرير» سلسلة نصية إلى int، لأن السلسلة النصية قد تكون تالفة أو فارغة أو تحتوي على مسافات زائدة.

\n\n

في هذه المقالة، سنحلل تحويل سلسلة نصية إلى رقم في Go بأمثلة حقيقية، وسنستعرض الأخطاء التي يقع فيها حتى المطورون ذوو الخبرة، وسنقدم أنماطاً عملية للكود. هيا بنا!

\n\n

1. الأداة الرئيسية: حزمة strconv

\n\n

في المكتبة القياسية للغة Go، تتولى حزمة strconv مسؤولية تحويل السلاسل النصية. تحتوي على ثلاث دوال رئيسية لتحويل سلسلة نصية إلى عدد صحيح:

\n\n
    \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

الخطأ الأكثر شيوعاً هو تجاهل الخطأ المرتجع. دعنا نرى إلى ماذا يؤدي هذا.

\n\n

مثال 1: تجاهل الخطأ — نحصل على خلل

\n\n
package 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) وستقضي ساعات في التصحيح، متسائلاً لماذا يتصرف برنامجك بشكل غريب. تعامل مع الخطأ دائماً!

\n\n

2. أهم 5 أخطاء عند تحويل string إلى int في Golang

\n\n

قمنا بتحليل الأسئلة على Stack Overflow واستخرجنا المشكلات الأكثر شيوعاً. ها هي:

\n\n

الخطأ رقم 1: المسافات والأحرف غير المرئية

\n\n

السلسلة النصية " 42 " أو "42\\n" — سترجع Atoi خطأ. Go لا تتسامح مع الأحرف الزائدة، على عكس بعض اللغات التي تقوم تلقائياً بقص السلسلة النصية.

\n\n
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() قبل التحويل.

\n\n
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، لكن هذا غير صحيح.

\n\n
num, err := strconv.Atoi("")\n// err: strconv.Atoi: parsing "": invalid syntax\n
\n\n

الحل: تحقق من طول السلسلة النصية أو تعامل مع الخطأ بشكل صريح، مع تعيين قيمة افتراضية.

\n\n

الخطأ رقم 3: تجاوز السعة (overflow)

\n\n

إذا كانت السلسلة النصية تحتوي على رقم لا يسع النوع المختار، سترجع Atoi أو ParseInt خطأ ErrRange والقيمة القصوى/الدنيا لذلك النوع.

\n\n
s := "99999999999999999999" // أكبر من int64\nnum, err := strconv.ParseInt(s, 10, 64)\nif er                

المدونات

توصيات الكتب