ورقة Go المرجعية
آخر تحديث
Hello World وبنية البرنامج
كل برنامج Go يعيش في حزمة؛ ونقطة الدخول هي func main في الحزمة main.
| العملية | الصياغة |
|---|---|
| تعريف الحزمة | package main |
| استيراد حزمة | import "fmt" |
| استيراد عدة حزم | import (\n "fmt"\n "os"\n) |
| نقطة الدخول | func main() { ... } |
| طباعة سطر | fmt.Println("Hello, World!") |
| طباعة منسّقة | fmt.Printf("%d items\n", n) |
| تشغيل ملف | go run main.go |
| بناء ثنائي | go build |
المتغيرات والأنواع
Go ذات أنواع ساكنة لكن يمكنها استنتاج الأنواع بـ :=.
| العملية | الصياغة |
|---|---|
| التعريف بنوع | var age int = 30 |
| التعريف بالاستنتاج | var name = "Ada" |
| التعريف القصير | count := 0 |
| عدة في آنٍ واحد | x, y := 1, 2 |
| ثابت | const Pi = 3.14 |
| القيم الصفرية | 0, "", false, nil |
| الأنواع الأساسية | int, float64, string, bool, byte, rune |
| تحويل النوع | f := float64(i) |
التحكم في التدفق
تملك Go كلمة حلقة واحدة - for - وبلا أقواس حول الشروط.
| العملية | الصياغة |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| If مع عبارة تهيئة | if v, ok := m[k]; ok { ... } |
| حلقة for (بنمط C) | for i := 0; i < 10; i++ { ... } |
| حلقة بنمط while | for x < 100 { ... } |
| حلقة لا نهائية | for { ... } |
| النطاق على شريحة | for i, v := range items { ... } |
| Switch | switch day { case 1: ...; default: ... } |
| Switch دون تعبير | switch { case x > 0: ... } |
| Break / continue | break, continue |
الدوال
الدوال قيم من الدرجة الأولى ويمكنها إرجاع نتائج متعددة.
| العملية | الصياغة |
|---|---|
| دالة أساسية | func add(a int, b int) int { return a + b } |
| نوع معامل مشترك | func add(a, b int) int { ... } |
| قيم إرجاع متعددة | func divmod(a, b int) (int, int) { return a / b, a % b } |
| قيم إرجاع مسمّاة | func split(sum int) (x, y int) { x = sum / 2; return } |
| دالة متغيرة الوسائط | func sum(nums ...int) int { ... } |
| دالة مجهولة الاسم | f := func() { ... } |
| إغلاق (closure) | func counter() func() int { ... } |
| Defer (يعمل عند الإرجاع) | defer file.Close() |
الشرائح والمصفوفات
المصفوفات ذات حجم ثابت؛ والشرائح عروض ديناميكية على المصفوفات.
| العملية | الصياغة |
|---|---|
| مصفوفة ثابتة الحجم | var a [3]int |
| شريحة حرفية | nums := []int{1, 2, 3} |
| صنع شريحة | s := make([]int, 0, 10) |
| الإلحاق (Append) | s = append(s, 4) |
| الطول / السعة | len(s), cap(s) |
| تقطيع شريحة | s[1:3] |
| النسخ | copy(dst, src) |
| التكرار | for i, v := range s { ... } |
الخرائط
الخرائط هي جداول hash المدمجة في Go.
| العملية | الصياغة |
|---|---|
| صنع خريطة | m := make(map[string]int) |
| خريطة حرفية | m := map[string]int{"a": 1, "b": 2} |
| تعيين قيمة | m["c"] = 3 |
| الحصول على قيمة | v := m["a"] |
| التحقق من الوجود | v, ok := m["x"] |
| حذف مفتاح | delete(m, "a") |
| الطول | len(m) |
| التكرار | for k, v := range m { ... } |
البُنى والدوال
البُنى تجمع الحقول؛ والدوال تربط السلوك عبر مستقبِل (receiver).
| العملية | الصياغة |
|---|---|
| تعريف بنية | type Point struct { X, Y int } |
| إنشاء نسخة | p := Point{X: 1, Y: 2} |
| الوصول إلى حقل | p.X |
| مؤشر إلى بنية | p := &Point{1, 2} |
| دالة بمستقبِل قيمة | func (p Point) Dist() float64 { ... } |
| دالة بمستقبِل مؤشر | func (p *Point) Move(dx int) { p.X += dx } |
| بنية مضمّنة | type Circle struct { Point; R int } |
| وسوم البنية | Name string مع وسم json:"name" محاط بعلامات backtick |
الواجهات
تُحقَّق الواجهات ضمنيًا - أيّ نوع لديه الدوال الصحيحة يتأهّل.
| العملية | الصياغة |
|---|---|
| تعريف واجهة | type Shape interface { Area() float64 } |
| التنفيذ (ضمني) | func (c Circle) Area() float64 { ... } |
| الواجهة الفارغة (any) | var x interface{} أو var x any |
| تأكيد النوع | s, ok := x.(string) |
| Switch على النوع | switch v := x.(type) { case int: ... } |
| واجهة Stringer | func (p Point) String() string { ... } |
Goroutines والقنوات
Goroutines خيوط خفيفة؛ والقنوات تمرّر القيم بينها.
| العملية | الصياغة |
|---|---|
| بدء goroutine | go doWork() |
| صنع قناة | ch := make(chan int) |
| قناة مخزّنة | ch := make(chan int, 5) |
| الإرسال إلى قناة | ch <- 42 |
| الاستقبال من قناة | v := <-ch |
| إغلاق قناة | close(ch) |
| النطاق على قناة | for v := range ch { ... } |
| Select على القنوات | select { case v := <-ch: ...; default: ... } |
| مجموعة انتظار | var wg sync.WaitGroup; wg.Add(1); wg.Wait() |
| Mutex | var mu sync.Mutex; mu.Lock(); mu.Unlock() |
معالجة الأخطاء
تُرجع Go الأخطاء كقيم - لا توجد استثناءات.
| العملية | الصياغة |
|---|---|
| إرجاع خطأ | func read() (string, error) { return "", err } |
| فحص خطأ | if err != nil { return err } |
| إنشاء خطأ | errors.New("not found") |
| خطأ منسّق | fmt.Errorf("bad id %d", id) |
| تغليف خطأ | fmt.Errorf("load: %w", err) |
| إلغاء التغليف / المطابقة | errors.Is(err, os.ErrNotExist) |
| المطابقة حسب النوع | errors.As(err, &target) |
| Panic / recover | defer func() { recover() }() |
صياغة Go التي تستخدمها أكثر من غيرها، على صفحة واحدة. ورقة Go المرجعية هذه هي مرجع سريع للّغة الأساسية - المتغيرات والأنواع، والشرائح والخرائط، والبُنى والواجهات، بالإضافة إلى goroutines والقنوات التي تجعل Golang تتألّق في التزامن.
كل ما هنا هو Go قياسية ويُترجم بسلسلة الأدوات الرسمية. انسخ ما تحتاجه، أو جرّب كل مقطع برمجي مباشرة في playground الخاص بـ Go - دون الحاجة إلى أي تثبيت.
الأسئلة الشائعة حول ورقة Go المرجعية
هل ورقة Go المرجعية هذه مجانية؟
ما الفرق بين := و var في Go؟
var x = 0 تُعرّف متغيرًا وتعمل في أيّ مكان، بما في ذلك على مستوى الحزمة. أمّا x := 0 فهي تعريف متغير قصير: تُعرّف وتُسند معًا، وتستنتج النوع، ولا يمكن استخدامها إلا داخل دالة. استخدم var عندما تحتاج إلى نوع صريح أو متغير على مستوى الحزمة، و := للتعريفات المحلية الموجزة.ما هي goroutines والقنوات؟
go someFunc(). أمّا القنوات فأنابيب مكتوبة الأنواع تتيح لـ goroutines التواصل بأمان: تُرسل goroutine بـ ch <- v وتستقبل أخرى بـ <-ch. ومعًا هما نموذج التزامن الأساسي في Go، الذي تختصره العبارة "شارك الذاكرة عبر التواصل".