المنشئات في Go: أفضل الممارسات لعام 2025 التي لا تذكرها الوثائق

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

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

ابدأ الدورة

المنشئات في Go: ليست "منشئات"، بل شيء أفضل



إذا أتيت إلى Go من عالم Python أو Java أو C++، فإن أول ما قد يصدمك على الأرجح هو أن Go لا يحتوي على منشئات. إطلاقًا. لا يوجد __init__ أو ClassName() أو new MyStruct() مع استدعاء تلقائي.



لكن لا داعي للذعر. هذا ليس خطأ، بل ميزة. في عام 2025، صاغ مجتمع Go بشكل نهائي أفضل الممارسات لتهيئة الكائنات. وهي أنيقة لدرجة أنك ستتوقف عن الاشتياق للمنشئات التقليدية.



في هذه المقالة، سنستعرض:

  • لماذا لا توجد منشئات في Go ولماذا هذا رائع
  • كيفية محاكاتها دون ألم
  • الدوال المصنعية، نمط البناء والواجهات الانسيابية
  • أخطاء المبتدئين والأنماط المضادة
  • أمثلة حقيقية من كود عام 2025


هيا بنا!



لماذا لا توجد منشئات في Go؟ (تلميح: إنه اختيار متعمد)



مصممو Go (روب بايك، كين تومبسون وآخرون) تخلوا عن المنشئات عن وعي. لماذا؟



  • البساطة. غالبًا ما تؤدي المنشئات إلى منطق خفي، وسحر، واستدعاءات ضمنية. Go هي لغة حيث الصريح أفضل من الضمني.
  • التحكم. أنت من يقرر متى وكيف تهيئ الهيكل. لا توجد حالات مخفية.
  • القيم الصفرية. في Go، كل متغير له قيمة افتراضية (صفرية). هذا يعني أن var user User هو كائن صالح بالفعل ويمكن العمل معه.


لكن هذا لا يعني أنه لا يمكنك كتابة دوال تقوم بإنشاء الكائنات وتكوينها. يمكنك! بل ويجب. لكنها لا تسمى "منشئات"، بل دوال مصنعية.



الأسلوب الأساسي: الدالة المصنعية (NewXXX)



النمط الأكثر شيوعًا هو دالة تبدأ بـ New. تقوم بإرجاع مؤشر للهيكل، مما يضمن إنشاء الكائن بشكل صحيح.



package main

import "fmt"

// User — هيكل بسيطtype User struct { Name string Email string Age int}

// NewUser — دالة مصنعية (منشئ)func NewUser(name string, email string, age int) *User { return &User{ Name: name, Email: email, Age: age, }}

func main() { user := NewUser("Alice", "alice@example.com", 30) fmt.Println(user.Name) // Alice}


هذا كلاسيكي. لكن ماذا لو كان هناك العديد من المعاملات؟ 5، 10، 15؟ تمريرها بالترتيب هو طريق للأخطاء. هنا تظهر المعاملات الاختيارية على المسرح.



أفضل ممارسة لعام 2025: الخيارات الوظيفية (Functional Options)



في عام 2025، الخيارات الوظيفية (functional options) هي المعيار الفعلي لتكوين الكائنات المعقدة في Go. هذا النمط شاعه ديف تشيني (Dave Cheney)، وهو يتناسب تمامًا مع فلسفة اللغة.



الفكرة: تمرر إلى المصنع دوال اختيارية تقوم بتعديل الهيكل قبل الإرجاع.



package main

import "fmt"

type Server struct { Host string Port int Timeout int // بالثواني TLS bool}

// Option — نوع وظيفي للخياراتtype Option func(*Server)

// WithTimeout — خيار لتعيين المهلةfunc WithTimeout(t int) Option { return func(s *Server) { s.Timeout = t }}

// WithTLS — خيار لتفعيل TLSfunc WithTLS(enabled bool) Option { return func(s *Server) { s.TLS = enabled }}

// NewServer — مصنع مع خياراتfunc NewServer(host string, port int, opts ...Option) *Server { // القيم الأساسية الافتراضية s := &Server{ Host: host, Port: port, Timeout: 30, // افتراضيًا TLS: false, } // تطبيق الخيارات for _, opt := range opts { opt(s) } return s}\

المدونات

توصيات الكتب