السبت - الخميس: 10:00 ص - 10:00 م

مقدمة إلى لغة Go (Golang)

مقدمة إلى لغة Go (Golang)

مقدمة إلى لغة Go (Golang)

Go (المعروفة أيضاً باسم Golang) هي لغة برمجة حديثة طورتها Google في 2009. تم تصميمها لتكون بسيطة، سريعة، وموثوقة. أصبحت Go واحدة من أكثر اللغات شعبية في تطوير الأنظمة، الخوادم، والخدمات السحابية.

لماذا Go؟

⚡ السرعة

أداء قريب من C/C++ مع بساطة Python

🔄 التزامن

Goroutines للبرمجة المتوازية السهلة

📦 البساطة

صيغة بسيطة وواضحة

🛠️ الأدوات

أدوات مدمجة ممتازة

مميزات Go:

  • ✅ سرعة التجميع (Compilation)
  • ✅ إدارة الذاكرة التلقائية
  • ✅ دعم التزامن المدمج
  • ✅ مكتبة قياسية شاملة
  • ✅ أدوات تطوير ممتازة
  • ✅ مجتمع نشط

إعداد بيئة التطوير:

1. تثبيت Go:

# Windows
# تحميل من https://golang.org/dl/
# تشغيل المثبت

# Linux/Mac
wget https://golang.org/dl/go1.21.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz

# إضافة إلى PATH
export PATH=$PATH:/usr/local/go/bin

2. التحقق من التثبيت:

go version
# يجب أن تظهر: go version go1.21.0 linux/amd64

3. إعداد متغيرات البيئة:

# GOPATH - مجلد المشاريع
export GOPATH=$HOME/go

# GOROOT - مجلد تثبيت Go
export GOROOT=/usr/local/go

# إضافة إلى PATH
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

أول برنامج Go:

إنشاء hello.go:

package main

import "fmt"

func main() {
    fmt.Println("مرحباً بالعالم!")
    fmt.Println("أهلاً وسهلاً في Go!")
}

تشغيل البرنامج:

go run hello.go
# النتيجة:
# مرحباً بالعالم!
# أهلاً وسهلاً في Go!

بناء البرنامج:

go build hello.go
./hello

أساسيات Go:

المتغيرات:

package main

import "fmt"

func main() {
    // تعريف متغير
    var name string = "أحمد"
    
    // تعريف قصير
    age := 25
    
    // متغيرات متعددة
    var (
        city    = "القاهرة"
        country = "مصر"
    )
    
    fmt.Println(name, age, city, country)
}

أنواع البيانات:

package main

import "fmt"

func main() {
    // أرقام صحيحة
    var age int = 25
    var height int64 = 180
    
    // أرقام عشرية
    var weight float64 = 75.5
    
    // نصوص
    var name string = "أحمد محمد"
    
    // منطقية
    var isStudent bool = true
    
    // مصفوفات
    var numbers [5]int = [5]int{1, 2, 3, 4, 5}
    
    // شرائح (Slices)
    var fruits []string = []string{"تفاح", "موز", "برتقال"}
    
    fmt.Println(age, height, weight, name, isStudent)
    fmt.Println(numbers, fruits)
}

الدوال:

package main

import "fmt"

// دالة بسيطة
func greet(name string) {
    fmt.Printf("مرحباً %s!
", name)
}

// دالة ترجع قيمة
func add(a, b int) int {
    return a + b
}

// دالة ترجع قيم متعددة
func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("لا يمكن القسمة على صفر")
    }
    return a / b, nil
}

func main() {
    greet("أحمد")
    
    result := add(5, 3)
    fmt.Println("5 + 3 =", result)
    
    quotient, err := divide(10, 2)
    if err != nil {
        fmt.Println("خطأ:", err)
    } else {
        fmt.Println("10 / 2 =", quotient)
    }
}

الهياكل (Structs):

package main

import "fmt"

// تعريف هيكل
type Person struct {
    Name    string
    Age     int
    Email   string
    Address string
}

// دالة مرتبطة بالهيكل
func (p Person) Introduce() {
    fmt.Printf("أنا %s، عمري %d سنة
", p.Name, p.Age)
}

// دالة لتعديل الهيكل
func (p *Person) SetAge(age int) {
    p.Age = age
}

func main() {
    // إنشاء شخص
    person := Person{
        Name:    "أحمد محمد",
        Age:     25,
        Email:   "[email protected]",
        Address: "القاهرة، مصر",
    }
    
    person.Introduce()
    person.SetAge(26)
    person.Introduce()
}

الواجهات (Interfaces):

package main

import "fmt"

// تعريف واجهة
type Shape interface {
    Area() float64
    Perimeter() float64
}

// تطبيق الواجهة - دائرة
type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14159 * c.Radius * c.Radius
}

func (c Circle) Perimeter() float64 {
    return 2 * 3.14159 * c.Radius
}

// تطبيق الواجهة - مستطيل
type Rectangle struct {
    Width  float64
    Height float64
}

func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func (r Rectangle) Perimeter() float64 {
    return 2 * (r.Width + r.Height)
}

func main() {
    shapes := []Shape{
        Circle{Radius: 5},
        Rectangle{Width: 4, Height: 6},
    }
    
    for _, shape := range shapes {
        fmt.Printf("المساحة: %.2f، المحيط: %.2f
", 
                   shape.Area(), shape.Perimeter())
    }
}

Goroutines - التزامن:

مثال بسيط:

package main

import (
    "fmt"
    "time"
)

func sayHello(name string) {
    for i := 0; i < 3; i++ {
        fmt.Printf("مرحباً %s! (مرة %d)
", name, i+1)
        time.Sleep(100 * time.Millisecond)
    }
}

func main() {
    // تشغيل عادي (متسلسل)
    sayHello("أحمد")
    sayHello("سارة")
    
    fmt.Println("---")
    
    // تشغيل متوازي مع Goroutines
    go sayHello("أحمد")
    go sayHello("سارة")
    
    // انتظار قليل لرؤية النتائج
    time.Sleep(1 * time.Second)
}

استخدام Channels:

package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for job := range jobs {
        fmt.Printf("العامل %d يبدأ المهمة %d
", id, job)
        time.Sleep(500 * time.Millisecond)
        fmt.Printf("العامل %d انتهى من المهمة %d
", id, job)
        results <- job * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)
    
    // تشغيل 3 عمال
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }
    
    // إرسال 5 مهام
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)
    
    // جمع النتائج
    for a := 1; a <= 5; a++ {
        result := <-results
        fmt.Printf("النتيجة: %d
", result)
    }
}

مشروع تطبيقي - خادم ويب بسيط:

package main

import (
    "fmt"
    "html/template"
    "net/http"
    "strconv"
)

type PageData struct {
    Title   string
    Message string
    Count   int
}

func homeHandler(w http.ResponseWriter, r *http.Request) {
    data := PageData{
        Title:   "مرحباً بك في Go!",
        Message: "هذا خادم ويب بسيط مكتوب بـ Go",
        Count:   42,
    }
    
    tmpl := `<!DOCTYPE html>
<html>
<head>
    <title>{{.Title}}</title>
</head>
<body>
    <h1>{{.Title}}</h1>
    <p>{{.Message}}</p>
    <p>العدد: {{.Count}}</p>
</body>
</html>`
    
    t, _ := template.New("home").Parse(tmpl)
    t.Execute(w, data)
}

func apiHandler(w http.ResponseWriter, r *http.Request) {
    name := r.URL.Query().Get("name")
    if name == "" {
        name = "زائر"
    }
    
    response := fmt.Sprintf("مرحباً %s! هذا API بسيط", name)
    w.Header().Set("Content-Type", "application/json")
    fmt.Fprintf(w, `{"message": "%s"}`, response)
}

func main() {
    http.HandleFunc("/", homeHandler)
    http.HandleFunc("/api", apiHandler)
    
    fmt.Println("الخادم يعمل على http://localhost:8080")
    http.ListenAndServe(":8080", nil)
}

إدارة الحزم (Packages):

إنشاء module:

# إنشاء مشروع جديد
mkdir my-go-app
cd my-go-app

# تهيئة module
go mod init github.com/username/my-go-app

# تثبيت حزمة خارجية
go get github.com/gorilla/mux

# تحديث التبعيات
go mod tidy

استخدام الحزم:

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "net/http"
)

func main() {
    r := mux.NewRouter()
    
    r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "مرحباً بك!")
    }).Methods("GET")
    
    r.HandleFunc("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
        vars := mux.Vars(r)
        fmt.Fprintf(w, "معرف المستخدم: %s", vars["id"])
    }).Methods("GET")
    
    http.ListenAndServe(":8080", r)
}

أفضل الممارسات في Go:

  • استخدم أسماء واضحة ومفهومة
  • اكتب تعليقات للدوال العامة
  • استخدم gofmt لتنسيق الكود
  • اختبر الكود باستخدام go test
  • استخدم interfaces للانفصال
  • تجنب المتغيرات العامة
  • استخدم error handling بشكل صحيح

أدوات مفيدة لـ Go:

🔧 gofmt

تنسيق الكود تلقائياً

🧪 go test

تشغيل الاختبارات

📊 go mod

إدارة التبعيات

🔍 go vet

فحص الكود

متى تستخدم Go؟

✅ مناسب لـ:

  • خوادم الويب
  • APIs و Microservices
  • أدوات DevOps
  • تطبيقات الشبكة
  • البرمجة المتوازية

❌ غير مناسب لـ:

  • تطبيقات سطح المكتب
  • تطبيقات الجوال
  • البرمجة العلمية المعقدة
  • الذكاء الاصطناعي

مشاريع يمكنك بناءها:

  • 🌐 خادم ويب بسيط
  • 📡 API REST
  • 🔄 أداة CLI
  • 📊 خادم قاعدة بيانات
  • 🌍 خادم Chat
  • 📁 مدير الملفات

Go هي لغة قوية وبسيطة. ابدأ في تعلمها اليوم!

تعلم Go معنا

تواصل معنا

عبر الماسنجر او الهاتف