مقدمة إلى Go Language
Go ، المعروفة أيضًا باسم Golang ، هي لغة برمجة مفتوحة المصدر طورها مهندسو Google Robert Griesemer و Rob Pike و Ken Thompson. تم تصميمه ليكون بسيطًا وفعالًا وموثوقًا. يعد Go مناسبًا بشكل مثالي لتطوير التطبيقات الحديثة ، لا سيما في مجالات أنظمة البنية التحتية من جانب الخادم والخلفية. بفضل تركيبته المباشرة ، والدعم المدمج للتزامن ، والأداء الممتاز ، أصبح Go خيارًا شائعًا بين المطورين لبناء تطبيقات الويب ، والخدمات المصغرة ، والأنظمة الموزعة.
نما النظام البيئي لـ Go بسرعة منذ إطلاقه في عام 2009 ، حيث يقدم مجموعة واسعة من المكتبات والأدوات للمطورين للاستفادة منها. اختارت شركات مثل Dropbox و Uber و Docker Go لأنظمتها الخلفية الأساسية ، مما يسلط الضوء بشكل أكبر على أهميتها وأهميتها في بيئة التكنولوجيا اليوم.
تهدف هذه المقالة إلى تزويدك بأساس متين في Go وصياغتها ، مع التركيز على ميزات اللغة الرئيسية لتبدأ في رحلتك مع برمجة Go.
تثبيت وإعداد Go
قبل أن تبدأ العمل مع Go ، ستحتاج إلى تثبيت اللغة على جهاز الكمبيوتر الخاص بك. اتبع هذه الخطوات للبدء:
- قم بزيارة موقع Go الرسمي وقم بتنزيل ملف التثبيت المناسب لنظام التشغيل الخاص بك.
- افتح الملف الذي تم تنزيله واتبع تعليمات التثبيت المقدمة من المثبت.
- قم بتعيين متغير البيئة
PATH
ليشمل دليل تثبيت Go. سيضمن هذا توفر أوامر Go من سطر الأوامر. في أنظمة Unix ، يمكنك عادةً إضافة السطر التالي إلى ملف.bashrc
أو.profile
الخاص بك:
export PATH=$PATH:/usr/local/go/bin
- أعد تشغيل الجهاز الطرفي أو موجه الأوامر لتطبيق التغييرات.
- تأكد من تثبيت Go بشكل صحيح عن طريق تشغيل الأمر التالي في جهازك الطرفي:
go version
إذا كان التثبيت ناجحًا ، فسيتم عرض إصدار Go المثبت على جهاز الكمبيوتر الخاص بك في الإخراج.
الآن بعد أن تم تثبيت Go على جهاز الكمبيوتر الخاص بك ، حان الوقت للتعمق في أساسيات اللغة.
فهم بناء الجملة وأنواع البيانات
صُمم بناء جملة Go ليكون بسيطًا وسهل القراءة. سنغطي هنا بعض عناصر اللغة الأساسية ، بما في ذلك الحزم والواردات والمتغيرات وأنواع البيانات الأساسية.
الحزم والواردات
يتم تنظيم برامج Go في packages
، مما يساعد على تكوين الكود وإدارته. الحزمة هي في الأساس دليل يحتوي على واحد أو أكثر من ملفات Go source. يجب أن يعلن السطر الأول من كل ملف Go عن الحزمة التي ينتمي إليها:
package main
في المثال أعلاه ، ينتمي الملف المصدر إلى الحزمة "الرئيسية". تتكون كتلة التعليمات البرمجية التي تلي إعلان الحزمة عادةً من عبارات import
التي تتضمن الحزم الأخرى اللازمة لبرنامجك:
import ( "fmt" "math" )
تحدد عبارة import
الحزم التي سيتم استيرادها إلى الملف الحالي ، مما يسمح لك بالوصول إلى ميزاتها المصدرة ، مثل الوظائف والمتغيرات.
المتغيرات والثوابت
يمكن الإعلان عن المتغيرات في Go باستخدام الكلمة الأساسية var
، متبوعة باسم المتغير والنوع والقيمة الأولية الاختيارية:
var x int = 10
إذا تم توفير القيمة الأولية ، فيمكن أن يستنتج Go النوع ، مما يسمح لك بحذف تصريح النوع:
var x = 10 // x is an int
يمكنك أيضًا استخدام صيغة إعلان المتغير القصير لـ Go ، والتي تستنتج النوع تلقائيًا وتعين قيمة أولية:
x := 10 // x is an int
يمكن تعريف الثوابت باستخدام الكلمة الأساسية const
. يجب أن تكون قيمها معروفة في وقت الترجمة ولا يمكن تغييرها أثناء تنفيذ البرنامج:
const PI = 3.14159
أنواع البيانات الأساسية
يحتوي Go على العديد من أنواع البيانات الأساسية ، بما في ذلك:
- الأعداد الصحيحة: يمكن التصريح عن الأعداد الصحيحة الموقعة باستخدام
int
أوint8
أوint16
أوint32
أوint64
. يمكن تعريف الأعداد الصحيحة غير الموقعة باستخدامuint
أوuint8
أوuint16
أوuint32
أوuint64
. - أرقام الفاصلة العائمة: يمكن تعريفها باستخدام إما
float32
أوfloat64
. - الأعداد المركبة: يتم التصريح عن الأعداد المركبة باستخدام
complex64
أوcomplex128
. - القيم المنطقية: يتم تمثيل القيم المنطقية بواسطة نوع البيانات
bool
ويمكن أن يكون لها القيمةtrue
أوfalse
. - السلاسل النصية: سلاسل Go هي سلاسل من الأحرف المشفرة UTF-8. إنها غير قابلة للتغيير ، ويتم تحديد طولها في وقت التشغيل.
بالإضافة إلى ذلك ، يدعم Go أنواع البيانات المركبة ، مثل:
- المصفوفات: تسلسلات ذات طول ثابت لعناصر من نفس النوع.
- الشرائح: متواليات الطول الديناميكي لعناصر من نفس النوع.
- الخرائط: مجموعات غير مرتبة من أزواج المفتاح والقيمة ، حيث يمكن أن يكون للمفاتيح والقيم أي نوع محدد.
مع استمرار تعلم Go ، ستتمكن من الجمع بين أنواع البيانات الأساسية والبنى هذه لإنشاء تطبيقات أكثر تعقيدًا وتنوعًا.
وظائف وطرق في Go
الوظائف هي إحدى اللبنات الأساسية لأي لغة برمجة ، و Go ليست استثناءً. يتم تعريف الوظائف في Go باستخدام الكلمة الأساسية func
، متبوعة باسم الوظيفة ومعلمات الإدخال ونوع الإرجاع وجسم الوظيفة. يمكن أن ترجع الدالات في Go قيمًا متعددة ، مما يسهل التعامل مع العمليات المعقدة وفحص الأخطاء.
فيما يلي مثال على وظيفة Go البسيطة:
package main import ( "fmt" ) func add(a int, b int) int { return a + b } func main() { result1 := add(5, 7) fmt.Println("The sum is:", result1) }
في هذا المثال ، نحدد دالة add
بسيطة تأخذ معلمتين صحيحين وتعيد مجموعهما. ثم يتم استدعاء الوظيفة من الوظيفة main
، ويتم طباعة النتيجة.
طرق في Go
تتشابه الأساليب في Go مع الوظائف ، ولكنها مرتبطة بنوع معين من أجهزة الاستقبال ، ويتم استدعاؤها على مثيل من نوع جهاز الاستقبال. هذا يجعل من الممكن إضافة سلوك إلى الأنواع الحالية ، على غرار كيفية تعريف لغات البرمجة الموجهة للكائنات الأساليب في الفئات. هنا مثال:
package main import ( "fmt" ) type Circle struct { radius float64 } func (c Circle) area() float64 { return 3.14159 * c.radius * c.radius } func main() { myCircle := Circle{radius: 5} circleArea := myCircle.area() fmt.Printf("The area of the circle is: %.2f\n", circleArea) }
في هذا المثال ، نحدد بنية Circle
بحقل radius
. ثم يتم تحديد طريقة تسمى area
لنوع Circle
. تحسب هذه الطريقة مساحة الدائرة باستخدام نصف القطر وترجع النتيجة كقيمة float64.
هياكل التحكم في Go
هياكل التحكم هي أساس أي لغة برمجة لأنها تملي تدفق البرنامج. يقدم Go العديد من هياكل التحكم للتفرع الشرطي والتكرار الحلقي وفحوصات الحالة المتعددة أو عمليات الاتصال.
إذا البيانات
في Go ، يتم تنفيذ التفريع الشرطي عادةً باستخدام عبارات if
. تقيّم هذه العبارات تعبيرًا منطقيًا ، وإذا كان صحيحًا ، فنفّذ كتلة التعليمات البرمجية التي تلي التعبير. هذا مثال:
package main import ( "fmt" ) func main() { number := 42 if number%2 == 0 { fmt.Println("The number is even.") } else { fmt.Println("The number is odd.") } }
في هذا المثال ، نتحقق مما إذا كان الرقم زوجيًا أم فرديًا باستخدام عامل modulo وعبارة if
.
للحلقات
يحتوي Go على نوع واحد فقط من الحلقات: الحلقة for
. يمكن استخدامه لجميع أنواع سيناريوهات التكرار: التكرارات الثابتة ، والحلقات اللانهائية ، وحلقات "while". هذا مثال:
package main import ( "fmt" ) func main() { for i := 1; i <= 5; i++ { fmt.Println("Iteration:", i) } }
في هذا المثال ، نستخدم حلقة for
مع عداد للتكرار خمس مرات وطباعة رقم التكرار الحالي.
تبديل واختيار العبارات
يوفر Go بيان switch
لفحوصات الحالة المتعددة وبيان select
لعمليات الاتصال. فيما يلي مثال على عبارة switch
:
package main import ( "fmt" ) func main() { grade := "B" switch grade { case "A": fmt.Println("Excellent!") case "B": fmt.Println("Good") case "C": fmt.Println("Fair") case "D": fmt.Println("Poor") default: fmt.Println("Invalid grade") } }
في هذا المثال ، نستخدم عبارة switch
للتحقق من درجة الإدخال وطباعة ملاحظة الأداء المقابلة. على عكس اللغات الأخرى ، لا يتطلب Go تعليمة break
في نهاية كل كتلة حالة ، حيث يخرج من عبارة switch
بعد تنفيذ حالة مطابقة.
التزامن في Go
تتمثل إحدى أقوى ميزات Go في دعمها المدمج للتزامن باستخدام Goroutines والقنوات. يسمح التزامن بسلاسل تنفيذ متعددة للتشغيل في وقت واحد ، مما يتيح أداء واستجابة أفضل في التطبيقات.
جوروتين
Goroutines هي عمليات تنفيذ وظائف متزامنة وخفيفة الوزن في Go. لإنشاء Goroutine ، ما عليك سوى إرفاق الكلمة الرئيسية go
مسبقًا باستدعاء الوظيفة. تبدأ الوظيفة في التنفيذ بالتزامن مع بقية البرنامج ، وتشترك في نفس مساحة العنوان. هذا مثال:
package main import ( "fmt" "time" ) func display(message string) { for i := 0; i < 5; i++ { fmt.Println(message) time.Sleep(1 * time.Second) } } func main() { go display("Hello") go display("World") // Let Goroutines finish before exiting time.Sleep(5 * time.Second) }
في هذا المثال ، نقوم بإنشاء Goroutines اللذين يعرضان الرسائل ويتوقفان مؤقتًا لمدة ثانية واحدة قبل التكرار. تنتظر الوظيفة الرئيسية لمدة خمس ثوانٍ للتأكد من انتهاء Goroutines قبل الخروج من البرنامج.
القنوات
القنوات هي وسيلة الاتصال بين Goroutines. أنها تسمح لـ Goroutines بإرسال واستقبال القيم بطريقة آمنة. هذا مثال:
package main import ( "fmt" ) func producer(numbers chan<- int) { for i := 1; i <= 5; i++ { fmt.Println("Produced:", i) numbers <- i } close(numbers) // Close the channel when done } func consumer(numbers <-chan int) { for number := range numbers { fmt.Println("Consumed:", number) } } func main() { numbers := make(chan int) go producer(numbers) go consumer(numbers) // Let the Goroutines finish time.Sleep(1 * time.Second) }
في هذا المثال ، أنشأنا producer
Goroutine الذي يولد الأرقام ويرسلها إلى قناة ، consumer
Goroutine الذي يعالج الأرقام المستلمة من القناة. باستخدام القنوات ، نضمن الاتصال الآمن بين Goroutines.
يعمل التزامن في Go ، باستخدام Goroutines والقنوات ، على تبسيط تطوير التطبيقات المتزامنة ، مما يجعلها أكثر كفاءة وموثوقية وسهلة الفهم.
أفضل الممارسات لكتابة كود Go
تعد كتابة كود Go نظيفًا وقابلًا للصيانة وفعالة أمرًا ضروريًا لتطوير تطبيقات قوية وضمان النجاح على المدى الطويل. فيما يلي بعض أفضل الممارسات التي يجب اتباعها عند العمل مع Go:
اصطلاحات التسمية الصحيحة
تلعب اصطلاحات التسمية دورًا مهمًا في جعل كود Go الخاص بك مفهومًا وقابلًا للصيانة. اتبع هذه الإرشادات للتسمية في Go:
- يجب أن تكون أسماء الحزم صغيرة وقصيرة وموجزة. تجنب استخدام الشرطة السفلية أو أسماء الحالة المختلطة.
- يجب أن تكون أسماء المتغيرات والوظائف والطرق مكتوبة بحروف الجمل ، مع كتابة الحرف الأول من كل كلمة بأحرف كبيرة ، باستثناء الكلمة الأولى.
- يجب أن تبدأ المعرفات المصدرة ، مثل الوظائف والأساليب والمتغيرات التي يمكن الوصول إليها من الحزم الأخرى ، بحرف كبير.
- يجب أن تبدأ المعرفات غير المصدرة ، والتي تقتصر على الحزمة حيث تم تعريفها ، بحرف صغير.
التنسيق الصحيح
إن الالتزام بتنسيق ثابت عبر كود Go الخاص بك يجعل من السهل قراءته وفهمه. طور مجتمع Go أداة تسمى gofmt تقوم تلقائيًا بتنسيق التعليمات البرمجية وفقًا للإرشادات الموصى بها. استخدم هذه الأداة للتأكد من أن التعليمات البرمجية الخاصة بك تلتزم بأسلوب ثابت.
اكتب وظائف قصيرة ومركزة
تأكد من أن وظائفك وأساليبك قصيرة ومركزة على غرض واحد. يؤدي ذلك إلى تحسين إمكانية القراءة ، وإمكانية الصيانة ، وتبسيط الاختبار. بدلًا من كتابة دالة واحدة مع العديد من المسؤوليات المختلفة ، قسِّمها إلى وظائف أصغر وأكثر تحديدًا. يساعد هذا الأسلوب أيضًا في إعادة استخدام التعليمات البرمجية عبر أجزاء مختلفة من التطبيق الخاص بك.
معالجة صارمة للأخطاء
تعتبر معالجة الأخطاء جانبًا أساسيًا من برمجة Go. يشجعك Go على التعامل مع الأخطاء بشكل صريح ، بدلاً من الاعتماد على الاستثناءات. عندما تقوم دالة بإرجاع خطأ ، قم دائمًا بفحصها والتعامل معها بشكل مناسب. استخدم المصطلح الاصطلاحي if err != nil
pattern للتأكد من أن برنامجك يتصرف بشكل صحيح في حالة وجود أخطاء. بالإضافة إلى ذلك ، قم بتوفير سياق في رسائل الخطأ لمساعدتك أنت والمطورين الآخرين على تحديد المشكلات وتشخيصها بسهولة أكبر.
اكتب اختبارات الوحدة الشاملة
تعد اختبارات وحدة الكتابة ضرورية لضمان صحة وموثوقية كود Go الخاص بك. يحتوي Go على دعم مدمج للاختبار من خلال حزمة الاختبار الخاصة به. اكتب اختبارات للوظائف والطرق والحزم الفردية للتحقق من صحة سلوكهم والتعرف على المشكلات المحتملة أثناء إجراء تغييرات على التعليمات البرمجية الخاصة بك. استثمر الوقت في كتابة اختبارات شاملة وقابلة للصيانة لمنع الأخطاء وزيادة الثقة في التعليمات البرمجية الخاصة بك.
استخدم حزم Go والمكتبات بحكمة
يتمتع Go بنظام بيئي قوي به العديد من المكتبات والحزم ، سواء في المكتبة القياسية أو من المجتمع الأوسع. أثناء استخدام المكتبات يمكن أن يوفر الوقت ، كن حذرًا عند اختيار التبعيات الخارجية. اختر دائمًا المكتبات ذات السمعة الطيبة والموثقة جيدًا وتقييم خيارات متعددة قبل اتخاذ القرار. بالإضافة إلى ذلك ، احتفظ بقائمة التبعيات الخاصة بك قابلة للإدارة والمراقبة بحثًا عن مشكلات الأمان والأداء المحتملة.
وثق الرمز الخاص بك
اكتب تعليقات واضحة وموجزة ووثق التعليمات البرمجية الخاصة بك باستخدام اصطلاحات مستندات Go. يعد توثيق التعليمات البرمجية الخاصة بك مع التعليقات والتوضيحات والأمثلة المناسبة أمرًا بالغ الأهمية لقابلية الصيانة والعمل الجماعي على المدى الطويل.
حالات الاستخدام الشائعة ومكتبات Go
Go هي لغة برمجة متعددة الاستخدامات مع العديد من حالات الاستخدام. تشمل بعض مجالات التطبيق الأكثر شيوعًا لـ Go ما يلي:
- البرمجة من جانب الخادم وخدمات الويب
- الشبكات والأنظمة الموزعة
- هندسة الخدمات المصغرة
- أدوات DevOps و CLI
فيما يلي قائمة ببعض المكتبات والأطر الشائعة في نظام Go الذي يلبي احتياجات التطوير المشتركة:
أطر الويب والمكتبات
- Gin: إطار ويب سريع وبسيط وخفيف الوزن مع واجهة برمجة تطبيقات تشبه مارتيني.
- Echo: إطار عمل ويب عالي الأداء وقابل للتوسيع ومبسط لـ Go.
- Revel: إطار عمل ويب متكامل لا يتطلب أي تكوين أو رمز معياري للبدء.
أدوات API والبروتوكول
- gRPC: إطار عمل RPC عالمي عالي الأداء ومفتوح المصدر.
- Gorilla Mux: موجه عناوين URL قوي ومكتبة مرسل لبناء تطبيقات الويب Go وواجهات برمجة التطبيقات.
برامج تشغيل قواعد البيانات والمساعدين
- GORM: مكتبة ORM رائعة لـ Go تدعم أنظمة قواعد بيانات متنوعة مثل PostgreSQL و MySQL و SQLite والمزيد.
- sqlx: امتداد لحزمة قاعدة البيانات / SQL القياسية الذي يبسط ويعزز عمليات قاعدة البيانات مع الحفاظ على التوافق مع الحزمة القياسية.
إلى جانب هذه المكتبات ، تقدم مكتبة Go القياسية العديد من الحزم المفيدة للعمل مع مجموعة واسعة من الوظائف ، مثل الشبكات ، والإدخال / الإخراج ، وهياكل البيانات ، والخوارزميات ، والمزيد.
تجدر الإشارة إلى أن تعلم لغة برمجة Go واستخدام المكتبات / واجهات برمجة التطبيقات الشائعة هو مجرد جانب واحد من جوانب بناء تطبيق ناجح. لتسريع عملية التطوير الخاصة بك والتخلص من الديون التقنية ، قد تفكر في تجربة AppMaster - نظام أساسي لا يحتوي على رمز يسمح لك ببناء تطبيقات الويب والجوال والخلفية باستخدام واجهة مرئية مع إنشاء شفرة المصدر تلقائيًا بدون أي دين تقني. مع منصة AppMaster ، يمكن تطوير تطبيقات Go الخاصة بك بسرعة تصل إلى 10 أضعاف و 3 مرات أكثر فعالية من حيث التكلفة ، وتغطي مجموعة واسعة من الوظائف وحالات الاستخدام.