Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

دوال الـ Constructor

جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 10 من 107.

لا تمتلك لغة Go منشئات (constructors) مثل اللغات الأخرى. بدلاً من ذلك، العرف المتبع هو إنشاء دالة تسمى NewTypeName تعيد هيكلاً (struct) مهيأً، وغالباً ما يكون كمؤشر (pointer).

دالة بناء أساسية

type Person struct {
    Name string
    Age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{
        Name: name,
        Age:  age,
    }
}

منشئ بقيم افتراضية

type Config struct {
    Host    string
    Port    int
    Timeout int
}

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // قيمة افتراضية
        Timeout: 30,      // قيمة افتراضية
    }
}

منشئ مع التحقق من الصحة

func NewPerson(name string, age int) *Person {
    if name == "" {
        name = "Unknown"
    }
    if age < 0 {
        age = 0
    }
    return &Person{
        Name: name,
        Age:  age,
    }
}

استخدام دوال البناء (Constructor functions)

func main() {
    p1 := NewPerson("Alice", 25)
    fmt.Println(p1.Name) // Alice

    p2 := NewPerson("", -5)
    fmt.Println(p2.Name) // غير معروف
    fmt.Println(p2.Age)  // 0
}

تُرجع دوال المنشئ (Constructor functions) مؤشراً (*StructName) باستخدام &. هذا يتجنب نسخ الهيكل (struct) ويسمح للدوال (methods) ذات مستقبلات المؤشر (pointer receivers) بالعمل مباشرة. توضع عمليات التحقق والقيم الافتراضية داخل المنشئ.

challenge icon

التحدي

متوسط

أنشئ دالة منشئ NewBankAccount للـ BankAccount struct مع التحقق من الصحة:

  • تأخذ name (string) و balance (float64) كبارامترات
  • إذا كان name فارغاً، القيمة الافتراضية هي "Unnamed"
  • إذا كان balance سالباً، القيمة الافتراضية هي 0
  • قم بتعيين Owner إلى "Default Owner" دائماً
  • أعد مؤشراً (pointer) إلى الـ struct الجديد

ورقة مرجعية

تستخدم لغة Go دوال البناء (constructor functions) بدلاً من المنشئات (constructors). العرف المتبع هو تسميتها NewTypeName وإرجاع مؤشر (pointer) إلى الهيكل (struct) الذي تم تهيئته.

دالة بناء أساسية:

type Person struct {
    Name string
    Age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{
        Name: name,
        Age:  age,
    }
}

دالة بناء مع قيم افتراضية:

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // قيمة افتراضية
        Timeout: 30,      // قيمة افتراضية
    }
}

دالة بناء مع التحقق من الصحة:

func NewPerson(name string, age int) *Person {
    if name == "" {
        name = "Unknown"
    }
    if age < 0 {
        age = 0
    }
    return &Person{
        Name: name,
        Age:  age,
    }
}

ترجع دوال البناء مؤشراً (*StructName) باستخدام & لتجنب نسخ الهيكل (struct) وللسماح لطرق استقبال المؤشر (pointer receiver methods) بالعمل مباشرة.

جرّب بنفسك

package main

import "fmt"

func main() {
    var name string
    var balance float64
    fmt.Scan(&name, &balance)

    account := NewBankAccount(name, balance)

    fmt.Printf("Account: %s\n", account.Name)
    fmt.Printf("Balance: %.2f\n", account.Balance)
    fmt.Printf("Owner: %s\n", account.Owner)
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming