مقدمة: لماذا الكود النظيف بلغة Go ليس رفاهية بل ضرورة
\n\nGo (أو Golang) هي لغة تبدو للوهلة الأولى بسيطة وحتى مملة. لا تحتوي على الأدوية (حتى الإصدار 1.18)، ولا تحتوي على كلاسات، ولا تحتوي على آلة افتراضية. لكن هذه البساطة هي ما يجعلها ساحة مثالية للمعركة من أجل الكود النظيف. إذا كنت تكتب بلغة Go ويبدأ مشروعك في أن يشبه السباغيتي من goroutine و switch غير القابلة للقراءة - فأنت تفقد الميزة الرئيسية للغة: سرعة التطوير وسهولة الصيانة.
في هذه المقالة، سنحلل 7 قواعد عملية ستساعدك على كتابة كود Go اصطلاحي سيكون مفهومًا ليس فقط للمترجم ولكن أيضًا لزملائك (ولنفسك بعد شهر). هيا بنا!
\n\n1. أسماء المتغيرات الصحيحة: قصيرة وواضحة
\n\nفي Go، من المعتاد استخدام أسماء قصيرة ولكن ذات معنى. على عكس Java، حيث ListOfUserOrders أمر طبيعي، في Go سترى orders أو حتى os. لماذا؟ لأن Go هي لغة لقراءة الكود، وليس لكتابته.
القواعد الأساسية للتسمية في Go
\n- \n
- المتغيرات المحلية: 1-2 حرف للأشياء الواضحة (
i- عداد،s- سلسلة نصية). \n - الحزم: كلمة واحدة، أحرف صغيرة، بدون شرطات سفلية (
http,fmt). \n - المعرفات المُصدَّرة: تبدأ بحرف كبير (
GetUser). \n - الاختصارات: تُكتب بحالة حرف واحدة (
HTTP,URL, وليسHttpأوUrl). \n
// سيء\nfunc GetUserDataFromDatabaseByID(userID string) (UserData, error) {\n var userDataFromDb UserData\n // ...\n return userDataFromDb, nil\n}\n\n// جيد\nfunc GetUser(id string) (User, error) {\n var u User\n // ...\n return u, nil\n}\n\nنصيحة: إذا كان اسم المتغير يتكون من أكثر من كلمتين - فمن المحتمل أنك تزيد الأمور تعقيدًا.
\n\n2. التنسيق: ثق بـ gofmt
\n\nفي Go لا توجد "حروب أسلوب". أمر gofmt يقرر كل شيء نيابة عنك. هذه ليست توصية - إنها معيار. إذا كنت لا تستخدم gofmt - فأنت لا تكتب بلغة Go، بل تكتب "بلهجة Go".
ماذا يفعل gofmt؟
\n- \n
- يضبط المسافات البادئة (علامات تبويب، وليس مسافات). \n
- يزيل فواصل الأسطر الزائدة. \n
- يُحاذي التعليقات. \n
- يزيل الواردات غير المستخدمة (مع العلم
-s). \n
// قبل gofmt\nfunc add (a int,b int) int{\nreturn a+b\n}\n\n// بعد gofmt\nfunc add(a, b int) int {\n return a + b\n}\n\nفي أي محرر حديث (VS Code, GoLand)، يتم تشغيل gofmt تلقائيًا عند الحفظ. إذا لم يكن كذلك - قم بإعداده. سيوفر لك ساعات من مراجعة الكود.
3. معالجة الأخطاء: لا تتجاهل، لا تُصاب بالذعر
\n\nفي Go لا توجد استثناءات (try-catch). الأخطاء هي مجرد قيم يجب التحقق منها. هذه واحدة من أقوى نقاط اللغة، إذا استخدمتها بشكل صحيح.
\n\nقواعد العمل النظيف مع الأخطاء
\n- \n
- تحقق دائمًا من
error. لا تستخدم_لتخطيها. \n - لا تستخدم
panicفي كود المكتبات. فقط إذا كان البرنامج لا يمكنه متابعة العمل (مثل عدم فتح ملف الإعدادات). \n - لف الأخطاء باستخدام
fmt.Errorf("context: %w", err)(Go 1.13+). \n
// سيء\nfunc ReadConfig(path string) *Config {\n data, _ := ioutil.ReadFile(path) // نتجاهل الخطأ\n var cfg Config\n json.Unmarshal(data, &cfg)\n return &cfg\n}\n\n// جيد\nfunc ReadConfig(path string) (*Config, error) {\n data, err := ioutil.ReadFile(path)\n if err != nil {\n return nil, fmt.Errorf("read config: %w", err)\n }\n var cfg Config\n if err := json.Unma