Go: مقدمة إلى لغة Go وتثبيتها

Go هي لغة متزامنة مُجمَّعة تم تطويرها في Google — وهي تُحل المشكلات الهندسية باستخدام قواعد نحوية بسيطة للغاية، مما يجعل مبدأ «السرعة والبساطة» حقيقة واقعة.

صُمم هذا الدليل التعليمي للمبتدئين الذين ليس لديهم أي خبرة سابقة. يبدأ الدليل بالأساسيات — «ما هي لغة Go؟» — ويُرشدك خطوة بخطوة حتى تتمكن من كتابة وتشغيل أول أداة لسطر الأوامر الخاصة بك بلغة Go. تُعد لغة Go المعيار السائد في التطبيقات السحابية الأصلية (Docker/Kubernetes) والخدمات الصغيرة وأدوات سطر الأوامر، ويستخدمها أكثر من 3 ملايين مطور حول العالم.

1. ما ستتعلمه



2. قصة حقيقية لمهندس برمجيات الخلفية

(1) المشكلة: تتعطل واجهة برمجة تطبيقات بايثون (API) تحت الضغط المتزامن

أليس هي مهندسة برمجيات خلفية، وقد واجهت خدمة واجهة برمجة التطبيقات (API) التي قامت بكتابتها بلغة بايثون بعض المشكلات مؤخرًا:

«خلال الفعالية التي أُقيمت عبر الإنترنت، تلقينا 10,000 طلب متزامن، مما تسبب في ارتفاع أوقات استجابة واجهة برمجة التطبيقات (API) بشكل حاد من 100 مللي ثانية إلى 8 ثوانٍ، ووصول معدل استخدام وحدة المعالجة المركزية (CPU) إلى 95%. وكادت الخدمة أن تتعطل.»

بعد مراجعة سجلات الخادم الخلفي، اكتشفت ما يلي:

سألها رئيسها: «هل يمكننا التحول إلى لغة برمجة أخرى؟» وبعد إجراء بعض الأبحاث، وُجهت أنظار أليس إلى Go.

(2) حل لعبة الغو

إليكم كيف أعادت أليس كتابة نفس المنطق التجاري بلغة Go:

GO
// main.go
package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello from Go!")
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

مقارنة الأداء (10,000 مستخدم متزامن لنفس السيناريو التجاري):

البعد Python Flask Go net/http
متوسط وقت الاستجابة 2,500 مللي ثانية 45 مللي ثانية
استخدام الذاكرة 500 جيجابايت 1.2 جيجابايت
استخدام وحدة المعالجة المركزية أحادي النواة 95% متعدد النوى 70%
وقت بدء التشغيل 5 ثوانٍ 20 مللي ثانية
طريقة النشر يتطلب بيئة تشغيل Python ملف ثنائي واحد

(3) الفوائد: لماذا يستحق تعلم لعبة «غو»؟

بعد الانتهاء من هذا الدرس، ستخطو خطوتك الأولى:



3. ما هي لعبة «غو»؟

Go (المعروفة أيضًا باسم Golang) هي لغة مفتوحة المصدر ومُجمَّعة تم إنشاؤها في عام 2009 وصممها كل من روبرت غريزيمر وروب بايك وكين طومسون من شركة Google. ويُعد الثلاثة من المساهمين الرئيسيين في لغة C ونظام Unix.

(1) الدافع وراء إنشاء لعبة «Go»

في عام 2007، واجهت «جوجل» مشكلة داخلية:

هدف لغة Go: حل المشكلات الهندسية باستخدام أقل قدر ممكن من قواعد الصياغة، مما يجعل التعاون بين الفرق الكبيرة سلسًا تمامًا كما هو الحال في الفرق الصغيرة.

(2) الفلسفات التصميمية الثلاث الرئيسية في لعبة «غو»

100%
graph TB
    A[Go Design Philosophy] --> B[Simplicity]
    A --> C[Concurrency]
    A --> D[Speed]

    B --> B1[25 keywords<br/>No inheritance/No issues]
    B --> B2[gofmt standard format<br/>No style debates in team code]

    C --> C1[goroutine<br/>2KB stack, start 1μs]
    C --> C2[channel<br/>CSP concurrency model]

    D --> D1[Compiled<br/>Compilation in seconds, 20ms start]
    D --> D2[Static link<br/>Single binary deployment]

(3) مجالات التطبيق النموذجية لـ Go

المجال مشاريع تمثيلية لماذا تختار Go
مصمم خصيصًا للسحابة Docker، Kubernetes، Istio ملف ثنائي واحد، تجميع متعدد المنصات، استهلاك منخفض للذاكرة
الخدمات الصغيرة أوبر، تويتش، دروبوكس مستوى عالٍ من التزامن، بروتوكول HTTP مدمج، مكتبة قياسية شاملة
أدوات CLI gh (GitHub CLI)، hugo، cobra تجميع سريع، متوافق مع مختلف الأنظمة الأساسية، توزيع في ملف واحد
قواعد البيانات TiDB، CockroachDB، InfluxDB أداء عالٍ، عملية إزالة الذاكرة غير المستخدمة مُحسَّنة جيدًا
DevOps Terraform، Prometheus، Consul معالجة ملايين المقاييس في وقت واحد
💡 نصيحة: إذا كنت قد سمعت عن Docker أو Kubernetes، فإن الكود الأساسي لهما مكتوب بلغة Go. وتُعد لغة Go «اللغة الأصلية» لعصر التطبيقات السحابية الأصلية.



4. الاختلافات بين لغة Go واللغات الأخرى

(1) نظرة عامة على توطين اللغات

100%
graph TB
    subgraph L[Division of Labor Among Programming Languages]
        direction TB
        G[Go<br/>Back-end Services/Cloud-native/CLI]
        P[Python<br/>Data Science/AI/Script]
        J[Java<br/>Enterprise-level/Android/Big Data]
        C[C++<br/>Games/System Software/Embedded]
        R[Rust<br/>System-level/Embedded/Security-sensitive]
    end

(2) Go مقابل Python مقابل Java مقابل C++

البعد Go Python Java C++
نظام الأنواع ثابت، ذو أنواع محددة بدقة ديناميكي، ذو أنواع محددة بدقة ثابت، ذو أنواع محددة بدقة ثابت، ذو أنواع محددة بدقة
التجميع مُجمَّع (بالثواني) مُفسَّر مُجمَّع (أبطأ) مُجمَّع (بطيء جدًّا)
نموذج التزامن goroutine (خفيف الوزن) مؤشر ترابط (مقيد بـ GIL) مؤشر ترابط مؤشر ترابط
استخدام الذاكرة منخفض (1–2 ميغابايت) مرتفع (50–200 ميغابايت) مرتفع (100–500 ميغابايت) متوسط (10–50 ميغابايت)
منحنى التعلم سهل أسهل حاد حاد جدًا
النشر ملف ثنائي واحد يلزم وجود بيئة تشغيل يلزم وجود JRE يلزم وجود مخرجات مُجمَّعة
السيناريوهات النموذجية الخلفية/التطبيقات السحابية الأصلية علم البيانات/الذكاء الاصطناعي تطبيقات المؤسسات برمجيات الأنظمة

(3) يجب أن تكون على دراية أيضًا بـ«نقاط ضعف» لغة Go

⚠️ ملاحظة: لغة Go ليست لغة واحدة تناسب جميع الاستخدامات. استخدم JavaScript لتطوير الواجهة الأمامية للمواقع الإلكترونية، وPython لتحليل البيانات، وKotlin أو Swift لتطوير تطبيقات الأجهزة المحمولة. تركز لغة Go على التطبيقات التي تعمل على جانب الخادم، وواجهة سطر الأوامر (CLI)، والتطبيقات السحابية الأصلية.



5. تثبيت Go

(1) رابط التنزيل

رابط التنزيل الرسمي: https://go.dev/dl/

المنصة برنامج التثبيت الحجم
ويندوز go1.22.x.windows-amd64.msi ~150 ميغابايت
macOS (Intel) go1.22.x.darwin-amd64.pkg ~150 ميغابايت
macOS (Apple Silicon) go1.22.x.darwin-arm64.pkg ~150 ميغابايت
Linux x86_64 go1.22.x.linux-amd64.tar.gz ~70 ميغابايت
Linux ARM64 go1.22.x.linux-arm64.tar.gz ~70 ميغابايت

▶ مثال: التثبيت المرئي لبرنامج Go على نظام ويندوز

BASH
# Steps 1: Double-click go1.22.x.windows-amd64.msi
# Steps 2: All the Way Next (Installed by default to C:\Program Files\Go)
# Steps 3: Check the box "Add Go to PATH" (Automatically Configure Environment Variables)
# Steps 4: Finish
# Steps 5: Verify Installation
go version

الناتج:

TEXT 📖 للعرض فقط
go version go1.22.x windows/amd64

▶ مثال: تثبيت Homebrew على نظام macOS

BASH
# Steps 1: Install Homebrew (If you haven't installed it yet)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Steps 2: Installation Go
brew install go

# Steps 3: Verification
go version

الناتج:

TEXT 📖 للعرض فقط
go version go1.22.x darwin/arm64

▶ مثال: الاستخراج والتثبيت يدويًّا على نظام لينكس

BASH
# Steps 1: Download (Using 1.22.x as an example)
wget https://go.dev/dl/go1.22.x.linux-amd64.tar.gz

# Steps 2: Extract to /usr/local
sudo tar -C /usr/local -xzf go1.22.x.linux-amd64.tar.gz

# Steps 3: Configure PATH (Write to ~/.bashrc or ~/.zshrc)
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc

# Steps 4: Verification
go version

الناتج:

TEXT 📖 للعرض فقط
go version go1.22.x linux/amd64

(5) التحقق من متغيرات البيئة

المتغير المعنى القيمة الافتراضية
GOROOT انتقل إلى مجلد التثبيت /usr/local/go (لينكس) / C:\Program Files\Go (ويندوز)
GOPATH دليل مساحة العمل ~/go
PATH مسار الملف القابل للتنفيذ يجب أن يتضمن $GOROOT/bin


6. أول برنامج «Hello World»

(1) إنشاء دليل عمل

BASH
mkdir hello-go
cd hello-go

(2) اكتب ملف main.go

BASH
# At hello-go, create a file in the directory
cat > main.go << 'EOF'
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
    fmt.Println("Welcome to Go programming!")
}
EOF

▶ مثال: go run التشغيل المباشر (أثناء التطوير)

BASH
go run main.go

الناتج:

TEXT 📖 للعرض فقط
Hello, World!
Welcome to Go programming!

سيتم تجميع وتشغيل go run، ولكنه لا يحفظ الملف الثنائي؛ وهو مناسب للتطوير وتصحيح الأخطاء.

▶ مثال: go build التحويل إلى ملف ثنائي (النشر في بيئة الإنتاج)

BASH
go build -o hello main.go

# Run the generated binary
./hello    # Linux/macOS
hello.exe  # Windows

go build يُنشئ ملفًا تنفيذيًّا واحدًا يمكن نسخه مباشرةً إلى أي خادم له نفس البنية وتشغيله دون تثبيت بيئة تشغيل Go.

▶ مثال: gofmt التنسيق التلقائي للكود

BASH
# Format all .go files in the current directory
gofmt -w .

# Check that the format is correct (do not modify)
gofmt -l .

gofmt هي «شرطة أسلوب البرمجة» لفريق Go — يجب أن يجتاز كل كود Go فحص gofmt، دون أي مجال للنقاش حول أسلوب البرمجة.



7. go mod init: إرساء الأسس لإدارة التبعيات

يتم تناول موضوع إدارة التبعيات الشاملة بالتفصيل في الدرس 8: حزم الأخطاء. هنا، سنضع الأساس اللازم لكي تفهم ما هو ملف go.mod.

(1) لماذا تُعد إدارة التبعيات أمرًا ضروريًا؟

لنفترض أن مشروعك يستخدم مكتبة تابعة لجهة خارجية. كيف تقوم بإعلانها؟ كيف تقوم بتحديثها؟ كيف تتأكد من أن جميع أعضاء الفريق يستخدمون نفس الإصدار؟

إجابة Go: ملف go.mod + الأمر go mod.

▶ مثال: go mod init إنشاء مشروع

BASH
# Run the following command in the project's root directory
cd hello-go
go mod init hello-go

الناتج:

TEXT 📖 للعرض فقط
go: creating new go.mod: module hello-go
go: now you can use 'go get' to add dependencies

تم إنشاء ملف go.mod:

TEXT 📖 للعرض فقط
module hello-go

go 1.22

(3) ما الذي تعنيه هاتان السطرتان من التعليمات البرمجية

الحقل المعنى
module hello-go اسم الوحدة (نوصي باستخدام اسم نطاق المشروع بترتيب عكسي؛ يستخدم هذا الدليل اسم المشروع)
go 1.22 الحد الأدنى لمتطلبات إصدار Go
💡 نصيحة: في الدرس 8، ستتعلم أوامر متقدمة مثل go get وgo mod tidy وgo.sum لدمج مكتبات الجهات الخارجية (مثل gin وgorm) في مشروعك.



8. مثال كامل: أول أداة لسطر الأوامر بلغة Go

دعونا نجمع كل ما تعلمناه أعلاه لكتابة أداة CLI بسيطة تُسمى بطاقة المعلومات الشخصية.

BASH
# Steps 1: Create a project directory
mkdir my-card && cd my-card

# Steps 2: Initialize module
go mod init my-card

# Steps 3: Write code
cat > main.go << 'EOF'
package main

import "fmt"

func main() {
    // Define a variable
    name := "Alice"
    role := "Backend Engineer"
    yearsOfExperience := 5

    // Print Card
    fmt.Println("========================================")
    fmt.Println("         Personal Card CLI")
    fmt.Println("========================================")
    fmt.Printf("Name:               %s\n", name)
    fmt.Printf("Role:               %s\n", role)
    fmt.Printf("Years of Experience: %d\n", yearsOfExperience)
    fmt.Printf("Language:           Go %s\n", "1.22+")
    fmt.Println("========================================")
}
EOF

# Steps 4: Run
go run main.go

# Steps 5: Compile into an executable file
go build -o card main.go
./card

النتيجة المتوقعة:

TEXT 📖 للعرض فقط
========================================
         Personal Card CLI
========================================
Name:               Alice
Role:               Backend Engineer
Years of Experience: 5
Language:           Go 1.22+
========================================
🔥 خطأ شائع: لا تكتب package main على أنها package Main (لغة Go تميز بين الأحرف الكبيرة والصغيرة). func main() هي نقطة دخول البرنامج ولا يمكن إعادة تسميتها.



❓ أسئلة شائعة

س ما هي العلاقة بين Go و Golang؟
ج الاسم الرسمي لـ Go هو "Go"، ولكن نظرًا لأن كلمة "Go" عامة جدًّا وتجعل من الصعب العثور على المعلومات، فإن المجتمع يستخدم عادةً "Golang" كاسم بديل (كما يستخدمه نطاق golang.org أيضًا). المصطلحان متبادلان تمامًا؛ استخدم أيًّا منهما تفضل.
س ما هي المجالات التي تناسب لغة Go بشكل أفضل؟
ج تكمن نقاط قوة لغة Go في التطوير من جانب الخادم: واجهات برمجة التطبيقات (APIs) والخدمات الصغيرة (microservices)، وأدوات واجهة سطر الأوامر (CLI)، والتطبيقات السحابية الأصلية (Docker و K8s مكتوبان بلغة Go)، وقواعد البيانات، وقوائم انتظار الرسائل. ولا يُعد لغة Go مناسبةً لواجهات المستخدم الرسومية (GUI) على أجهزة سطح المكتب، أو تطبيقات الأجهزة المحمولة، أو تطوير الواجهة الأمامية، أو محركات الألعاب (تُعد لغات أخرى أكثر ملاءمةً لهذه المجالات).
س ما مدى الفرق في الأداء بين لغة Go ولغة Python؟
ج بالنسبة للمهام التي تتطلب استخدامًا مكثفًا لوحدة المعالجة المركزية (CPU)، تكون لغة Go عادةً أسرع من لغة Python بمقدار 30 إلى 100 مرة؛ أما بالنسبة للمهام التي تتطلب استخدامًا مكثفًا لعمليات الإدخال/الإخراج (I/O)، فيمكن أن تكون أسرع بمقدار 10 إلى 50 مرة عند استخدام goroutines. وينبع هذا الفرق من: الترجمة المسبقة مقابل الترجمة التفسيرية، وgoroutines مقابل GIL، وتحسينات الكتابة القوية.
س ماذا أفعل إذا أبلغت go version بـ "الأمر غير موجود" بعد التثبيت؟
ج يرجع ذلك عادةً إلى عدم تكوين متغير PATH. في نظام Windows، أعد تشغيل المحطة الطرفية أو قم بتسجيل الخروج ثم تسجيل الدخول مرة أخرى؛ وفي نظامي Linux/macOS، قم بتشغيل source ~/.bashrc (أو ~/.zshrc). إذا لم ينجح ذلك، فتحقق مما إذا كان $GOROOT/bin مضمنًا في $PATH: echo $PATH | grep go.
س هل توجد اختلافات جوهرية بين الإصدار 1.22 من لغة Go والإصدارات السابقة؟
ج يقدم الإصدار 1.22 من لغة Go ثلاثة تغييرات رئيسية: (1) تحسينات في توجيه HTTP mux.HandleFunc("GET /path/{id}", h)؛ (2) حلقات for-range للأعداد الصحيحة for i := range 10؛ (3) تحسينات في نموذج الذاكرة. يستند هذا البرنامج التعليمي إلى الإصدار 1.22 من لغة Go أو ما بعده.
س هل أحتاج إلى تعلم لغة C قبل تعلم لغة Go؟
ج لا. أحد أهداف تصميم لغة Go هو أن تكون «أبسط من لغة C++». طالما أن لديك فهمًا أساسيًّا لأي لغة برمجة (سواء كانت Python أو Java أو JavaScript)، يمكنك البدء في تعلم لغة Go على الفور. تحتوي لغة Go على 25 كلمة رئيسية فقط، وهو عدد أقل من معظم اللغات.
س ما الفرق بين go run وgo build؟
ج go run = الترجمة + التشغيل + مسح الملفات المؤقتة (للتطوير)؛ go build = الترجمة فقط، وإنشاء ملف قابل للتنفيذ (لنشر الإنتاج). go run لا يحتفظ بملف .exe، بينما go build يحتفظ به.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (مستوى الصعوبة ⭐): قم بتثبيت Go 1.22 أو إصدار أحدث محليًّا، وقم بتشغيل go version، ثم التقط لقطة شاشة للتحقق؛ اكتب hello.go لإخراج العبارة "Hello, Go!".

  2. مشكلة متقدمة (درجة الصعوبة ⭐⭐): قم بتوسيع واجهة CLI لبطاقة «Personal Card» المذكورة أعلاه بإضافة متغيرين، هما city := "Shanghai" وhobby := "Coding"، وإلحاق هذين السطرين في نهاية البطاقة. وأخيرًا، قم بترجمة البرنامج إلى ملف قابل للتنفيذ باستخدام go build.

  3. التحدي (الصعوبة: ⭐⭐⭐): ابحث عن أداة واحدة من أدوات سطر الأوامر التي تستخدمها بشكل متكرر (مثل git / docker / kubectl) لترى ما إذا كانت مكتوبة بلغة Go. إذا كان الأمر كذلك، فاكتب مقالًا من 200 حرف تشرح فيه «لماذا يُعد لغة Go مناسبة لأدوات سطر الأوامر» (تلميح: الترجمة عبر الأنظمة المختلفة، ملف ثنائي واحد، سرعة التشغيل).

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%