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

ورقة 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 / elseif x > 0 { ... } else { ... }
If مع عبارة تهيئةif v, ok := m[k]; ok { ... }
حلقة for (بنمط C)for i := 0; i < 10; i++ { ... }
حلقة بنمط whilefor x < 100 { ... }
حلقة لا نهائيةfor { ... }
النطاق على شريحةfor i, v := range items { ... }
Switchswitch day { case 1: ...; default: ... }
Switch دون تعبيرswitch { case x > 0: ... }
Break / continuebreak, 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: ... }
واجهة Stringerfunc (p Point) String() string { ... }

Goroutines والقنوات

Goroutines خيوط خفيفة؛ والقنوات تمرّر القيم بينها.

العمليةالصياغة
بدء goroutinego 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()
Mutexvar 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 / recoverdefer func() { recover() }()

صياغة Go التي تستخدمها أكثر من غيرها، على صفحة واحدة. ورقة Go المرجعية هذه هي مرجع سريع للّغة الأساسية - المتغيرات والأنواع، والشرائح والخرائط، والبُنى والواجهات، بالإضافة إلى goroutines والقنوات التي تجعل Golang تتألّق في التزامن.

كل ما هنا هو Go قياسية ويُترجم بسلسلة الأدوات الرسمية. انسخ ما تحتاجه، أو جرّب كل مقطع برمجي مباشرة في playground الخاص بـ Go - دون الحاجة إلى أي تثبيت.

الأسئلة الشائعة حول ورقة Go المرجعية

هل ورقة Go المرجعية هذه مجانية؟
نعم. ورقة Go المرجعية هذه مجانية تمامًا، دون الحاجة إلى التسجيل. أضِفها إلى المفضلة وارجع إليها متى احتجت إلى البحث عن عملية على شريحة أو نمط قناة أو دالة بنية.
ما الفرق بين := و var في Go؟
var x = 0 تُعرّف متغيرًا وتعمل في أيّ مكان، بما في ذلك على مستوى الحزمة. أمّا x := 0 فهي تعريف متغير قصير: تُعرّف وتُسند معًا، وتستنتج النوع، ولا يمكن استخدامها إلا داخل دالة. استخدم var عندما تحتاج إلى نوع صريح أو متغير على مستوى الحزمة، و := للتعريفات المحلية الموجزة.
ما هي goroutines والقنوات؟
الـ goroutine خيط خفيف يديره وقت تشغيل Go - تبدأ واحدًا بكتابة go someFunc(). أمّا القنوات فأنابيب مكتوبة الأنواع تتيح لـ goroutines التواصل بأمان: تُرسل goroutine بـ ch <- v وتستقبل أخرى بـ <-ch. ومعًا هما نموذج التزامن الأساسي في Go، الذي تختصره العبارة "شارك الذاكرة عبر التواصل".
هل يمكنني التدرّب على Go عبر الإنترنت؟
نعم. افتح playground الخاص بـ Go لتشغيل أيّ مقطع برمجي من هذه الورقة المرجعية في متصفحك - دون الحاجة إلى تثبيت سلسلة أدوات Go. وعندما ترغب في تعلّم منظّم، تأخذك دورة Go التفاعلية المجانية من Coddy من المتغيرات والشرائح إلى goroutines والقنوات خطوة بخطوة.
هل هذه الورقة المرجعية مناسبة للمبتدئين؟
نعم. إنها مرتّبة من المواضيع الأكثر شيوعًا (المتغيرات والتحكم في التدفق والدوال) وصولًا إلى المتقدمة (goroutines والقنوات ومعالجة الأخطاء)، بحيث يمكنك استخدام الأقسام العلوية من اليوم الأول والتدرّج إلى البقية.
Coddy programming languages illustration

تعلّم Go مع Coddy

ابدأ الآن