مقدمة إلى لغة 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 معنا