Skip to content

دليل البدء مع Go

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

الخلفية

لغة Go تم إنشاؤها بالتعاون بين ثلاثة شخصيات كبيرة، وهم

  • Ken Thompson، حائز على جائزة تورينج، مؤسس نظام Unix، مؤسس لغة B، مؤسس لغة C
  • Rob Pike، أحد مؤلفي نظام التشغيل Plan9، أحد مخترعي UTF-8، الشخص الرئيسي في تصميم لغة Go
  • Robert Griesemer، مطور محرك JS V8، الأصغر بين الثلاثة

هناك أيضاً Renee French زوجة Rob Pike، وهي التي صممت شعار لغة Go، وهو مجرد مرموط أزرق.

في يوم ما، شعر ثلاثة مهندسين بالملل الشديد أثناء انتظار تجميع مشروع C++ طويل، وفي تلك اللحظة exactly، خطرت لـ Rob Pike فكرة جديدة: أراد تصميم لغة برمجة بسيطة وصغيرة وسريعة التجميع، مع أداء لائق في نفس الوقت، حتى لا يضطروا للانتظار الطويل في كل مرة يجمعون فيها. بعد عصف ذهني قصير، عقد الثلاثة اجتماعاً مختصراً في 20 سبتمبر 2007، وبدأوا مناقشة وتصميم النموذج الأولي لهذه اللغة، ومن تلك اللحظة، ولدت لغة Go رسمياً. بعد ذلك، جذب هذا الفريق الصغير المزيد والمزيد من المطورين ذوي التفكير المماثل، وأخيراً في 10 نوفمبر 2009، أصدرت شركة Google لغة Go كمصدر مفتوح برخصة BSD-3-Clause، وأطلقت أول إصدار تجريبي، وشكلت فريق تطوير رسمي.

تلميح

جدير بالذكر أنك قد ترى في أماكن أخرى من يسميها Golang، بما في ذلك مستودع Github لهذا الموقع يسمى Golang-Doc، لكن اسمها الرسمي كان دائماً Go. في الأيام الأولى، لأن نطاق go كان محجوزاً، استخدم الموقع الرسمي النطاق golang.org، مما جعل القادمين الجدد يظنون أنها تسمى Golang.

هذا هو شكل الموقع الرسمي في البداية

بعد ذلك، بعد ثلاث سنوات من التصميم والتطوير، أصدر فريق Go أول إصدار رسمي Go1.0 في مارس 2012 (في ذلك الوقت كانت سلسلة الأدوات ووقت تشغيل Go مكتوبة بلغة C، حتى Go1.5 أكمل الاعتماد الذاتي)، بعد ذلك يُصدر إصداران صغيران كل عام، واستمر في التشغيل والصيانة حتى الآن.

الثلاثة المؤسسون في الواقع تقاعدوا منذ وقت مبكر، في معظم الوقت كان قائد الفريق هو Russ Cox، الذي شارك في أعمال التطوير منذ قبل إصدار Go للجمهور، وبعد ذلك أدار فريق Go لمدة 12 عاماً، حتى أغسطس 2024 حين تنحى، وتولى Austin Clements المسؤولية وقيادة أعمال التطوير اللاحقة.

إذا كنت تريد فهم تاريخ لغة Go بعمق، انتقل إلى Go History لمعرفة المزيد.

الخصائص

  • قواعد بسيطة لغة Go قدمت تنازلات في الحرية والمرونة مقابل صيانة أفضل ومنحنى تعلم سلس.
  • نشر سهل الملفات الثنائية المُجمّعة بشكل ثابت في Go لا تعتمد على بيئة تشغيل إضافية، وسرعة التجميع سريعة جداً أيضاً.
  • التجميع المتقاطع Go يحتاج فقط لضبط معاملين أثناء التجميع، لتجميع برنامج يعمل على منصات أخرى.
  • التزامن طبيعي دعم Go للتزامن هو دعم أصلي، يحتاج فقط كلمة مفتاحية واحدة لبدء كوروتين غير متزامن.
  • جمع المهملات Go لديها أداء GC ممتاز، في معظم الحالات لا يتجاوز تأخير GC 1 ميلي ثانية.
  • مكتبة قياسية غنية من معالجة السلاسل إلى تحليل AST للكود المصدري، المكتبة القياسية الغنية والقوية هي الأساس المتين للغة Go.
  • سلسلة أدوات كاملة Go لديها سلسلة أدوات تطوير كاملة، تغطي التجميع، الاختبار، إدارة التبعيات، تحليل الأداء وغيرها.

لغة Go تخلت عن الوراثة، وأضعفت OOP، والفئات، والميتا برمجة، والأنماط، وتعبيرات Lambda وغيرها من الخصائص، ولديها أداء جيد وصعوبة بدء منخفضة، وهي مناسبة لتطوير الخدمات السحابية، وتطوير الخوادم التطبيقية، والبرمجة الشبكية. تأتي مع GC، لا تحتاج للمطورين لإدارة الذاكرة يدوياً، والتجميع الثابت والتجميع المتقاطع مناسبان جداً للعمليات.

عيوب لغة Go كثيرة أيضاً، مثل معالجة الأخطاء المثيرة للجدل، والأنماط الناقصة، والمكتبة القياسية غنية لكن هياكل البيانات المدمجة قليلة، ونوع interface{} ينتشر في كل مكان، ولا يوجد نوع تعداد، بالإضافة إلى ذلك، فريق تطوير Go عنيد جداً، ولا يحسن الاستماع لآراء المجتمع وغيرها. (مقارنة بذلك، Rust أفضل بكثير في معالجة الأخطاء، والأنماط، وإدارة التبعيات، والتعدادات، والواجهات وغيرها).

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

وبالمناسبة، Go أيضاً لغة مفتوحة المصدر بالكامل، يدير تطورها المجتمع وGoogle معاً، العنوان الرسمي في مستودع Google، وعلى Github نسخة مرآة مماثلة، إذا كنت مهتماً يمكنك المشاركة في تصميم اللغة.

الموقع الرسمي: The Go Programming Language

مستودع Google مفتوح المصدر: google/go: Google Open Source

مستودع Github: golang/go: The Go programming language

TIP

الكاتب سبق أن قدم PR لـ Go، إذا كنت تريد معرفة كيفية المساهمة بالكود لـ Go، يمكنك قراءة هذا المقال: كيفية المساهمة بالكود لـ Go.

أعتقد أن الكثيرين سمعوا عن Rust، وهي لغة برمجة عامة عالية الأداء، تاريخ ظهورها قبل Go بعام، تم إصدار Go1 رسمياً في 2012، وتم إصدار النسخة الرسمية من Rust في 2015، كلتاهما لغتان حديثتان نسبياً، الكاتب يحب كلتاهما، مجالات تطويرهما مختلفة، إذا لم تكن راضياً عن كفاءة تشغيل Go وقدرتها التعبيرية، جرب Rust، لكن صعوبة تعلمها ليست بسيطة مثل Go.

التثبيت

تنزيل لغة Go: Downloads - The Go Programming Language

Stable Version يشير إلى الإصدارين المستقرين اللذين في حالة الصيانة حالياً، Archived Version يشير إلى الإصدارات التاريخية التي لم تعد تُصان، انتقل إلى سجل التحديثات لمعرفة المزيد عن قواعد الصيانة ومعلومات الإصدارات التاريخية.

windows

لنظام windows، هناك نوعان متاحان: installer و archive، الأول هو حزمة التثبيت، تحتاج فقط للنقر، يُنصح باستخدام الأخير، سيجعلك أكثر دراية بهيكل مجلدات لغة go، في المستقبل إذا حدثت مشاكل لن تكون في حيرة. اختر تنزيل ملف zip، الملف المضغوط يحتوي على الكود المصدري للغة go وسلسلة الأدوات وبعض الوثائق، قم بفك ضغطه في المسار المحدد، ثم تحتاج لضبط متغيري بيئة النظام.

  • GOROOT - مسار تثبيت لغة go
  • GOPATH - مسار تخزين تبعيات لغة go

بعد الضبط، أضف عنصرين جديدين لمتغير بيئة النظام PATH

  • %GOROOT%\bin: هذا هو عنوان البرنامج الثنائي لـ go
  • %GOPATH%\bin: هذا هو عنوان تخزين الملفات الثنائية للتبعيات الخارجية التي سيتم تنزيلها مستقبلاً

نفذ أمر go version في powershell، وأخيراً عرض الإصدار بشكل طبيعي يعني أن التثبيت صحيح.

powershell
PS C:\user\username> go version
go version go1.21.3 windows/amd64

للتحديث تحتاج فقط لتنزيل zip الجديد والكتابة فوق مجلد التثبيت الأصلي.

linux

خذ ubuntu كمثال، انسخ رابط الإصدار المطلوب، ونزّله محلياً

sh
$ wget https://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gz

فك الضغط في الدليل المحدد

sh
$ tar -C ~/go -xzf go1.21.1.linux-amd64.tar.gz

ضبط متغيرات البيئة في ملف $HOME/.bashrc

sh
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

بعد الانتهاء تحقق من إصدار التثبيت، وتأكد من التثبيت الصحيح

sh
$ go version
go version go1.21.1 linux/amd64

للتحديث تحتاج فقط لتنزيل tar.gz الجديد والكتابة فوق مجلد التثبيت الأصلي.

إدارة التثبيت

طريقة التثبيت أعلاه كافية للاستخدام الأساسي، شخصياً أنصح باستخدام هيكل الدليل التالي لتخزين لغة go والملفات المشتقة

go/
|
|--root/
|  |
|  |--go1.21.3/
|  |
|  |--go1.20.10/
|
|--mod/
|  |
|  |--bin/
|  |
|  |--libs/
|
|--cache/
|
|--temp/
|
|--env

الشرح كالتالي

  • دليل go/root يُستخدم لتخزين ملفات المصدر لإصدارات go المختلفة
  • go/mod يوافق GOAPTH
  • go/mod/libs يوافق GOMODCACHE، أي عنوان تخزين التبعيات الخارجية المنزلة
  • go/mod/bin يوافق GOBIN، عنوان تخزين الملفات الثنائية للتبعيات الخارجية
  • go/cache، يوافق GOCACHE، تخزين ملفات الذاكرة المؤقتة
  • go/temp، يوافق GOTMPDIR، تخزين الملفات المؤقتة
  • go/env، يوافق GOENV، ملف تكوين متغيرات البيئة العامة

هذه الطريقة عند التحديث لا تحتاج للكتابة فوق مجلد التثبيت الأصلي، فقط تخزينه في دليل go/root، ثم تعديل متغير بيئة النظام GOROOT ليكون مجلد الإصدار المحدد في هذا الدليل. افتراضياً ملف env يُقرأ من المسار GOROOT/env، من خلال ضبط متغير النظام GOENV يمكن فصله عن GOROOT، لتجنب تغييرات تكوين متغيرات بيئة go عند تغيير الإصدار، فيما يلي الإعدادات الأولية لملف env.

ini
GO111MODULE=on
GOCACHE=go/cache
GOMODCACHE=go/mod/libs
GOBIN=go/mod/bin
GOTMPDIR=go/temp

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

إدارة الإصدارات المتعددة

كتبت أداة لإدارة الإصدارات المتعددة govm، استخدامها مع هيكل الدليل أعلاه يعطي أفضل نتيجة. يمكنها إدارة إصدارات Go المتعددة محلياً، يمكن التبديل بين الإصدارات في أي وقت، ويمكنها البحث وتنزيل إصدارات Go الأخرى وتثبيتها محلياً.

bash
$ govm search 1.22 -n 10
go1.22.6           76 MB
go1.22.5           76 MB
go1.22.4           76 MB
go1.22.3           76 MB
go1.22.2           76 MB
go1.22.1           76 MB
go1.22.0           76 MB

$ govm install 1.22.4
Fetch go1.22.4 from https://dl.google.com/go/go1.22.4.windows-amd64.zip
Downloading go1.22.4.windows-amd64.zip 100% |████████████████████████████████████████| (76/76 MB, 32 MB/s) [2s]
Extract go1.22.4.windows-amd64.zip to local store
Remove archive from cache
Version go1.22.4 installed

$ govm use 1.22.4
Use go1.22.4 now

# إعادة تسجيل الدخول للـ shell
$ go version
go version go1.22.4 windows/amd64

إذا كنت تريد معرفة كيفية كتابة أدوات سطر الأوامر بـ Go، إذا لم تمانع، يمكنك استخدام govm كمرجع مشروع، هي أيضاً مكتوبة بـ Go.

المحرر

حالياً IDE الرئيسي للغة go أنصح فقط بالاثنين التاليين

  1. goland: من إنتاج jetbrain، قوي، دعم شامل، لكن يحتاج دفع، يمكنك التفكير في IDEA Community Edition مع الإضافات
  2. vscode: مجاني، محرر متعدد الاستخدامات، مع الإضافات يمكنه كتابة أي لغة

إذا كان هناك محرر آخر يتناسب أكثر مع عادات استخدامك الشخصية يمكنك استخدامه، نوع المحرر ليس مهماً، إذا كنت تكتب فقط كود تمارين بسيط، يمكنك تجربة goplay الذي يوفره المسؤول، يمكنه تشغيل كود go عبر الإنترنت.

TIP

إذا كنت تستخدم JetBrains Toolbox، يمكنك تجربة أداة سطر أوامر كتبتها AutoToolBox، يمكنها توليد قائمة النقر اليمنين لـ Toolbox في windows، الصورة التوضيحية كالتالي.

كلمة أخيرة

صعوبة لغة Go بشكل عام ليست عالية، إذا كان لديك خبرة في لغات أخرى ستعلمها بسرعة كبيرة، عند مواجهة نقاط صعبة لا تفهمها أثناء التعلم يمكنك تخطيها أولاً، تعلم أي لغة يبدأ بالفهم العام لبنية اللغة وقواعدها، ثم التعمق في الخصائص والتفاصيل، وفلسفة الوثائق هي نفسها، مناسبة للتعلم الأولي. الكاتب نفسه مجرد طالب عادي، من الصعب تجنب الأخطاء والسهو، إذا اكتشفت أي خطأ يمكنك تقديم PR على Github، إذا أعجبك الوثائق يمكنك إعطاء Star على Github.

إذا كنت مطوراً للغات OOP القوية مثل Java، C# وغيرها، لا تدخل بأفكار OOP أولاً، وإلا ستشعر أن الكثير من تصميمات go غير مفهومة، وستعاني كثيراً عند كتابة الكود، الكاتب نفسه كان كذلك في البداية.

نظرة عامة

فيما يلي مقدمة بسيطة لمحتوى هذا الموقع، حتى تتمكن من القراءة حسب الحاجة، بعض الصفحات فارغة تعني أنها لم تُحدّث بعد.

  • مدخل اللغة: يشرح بشكل أساسي المحتوى المتعلق بلغة Go نفسها، أكثر نظرية.
    • أساسيات القواعد: يشرح بشكل أساسي القواعد الأساسية جداً، مثل if، for وغيرها من القواعد.
    • القواعد المتقدمة: يشرح الأشياء الفريدة لـ Go، المحتوى المتعلق بالوحدات، والاختبارات، والكوروتينات وغيرها.
    • المكتبة القياسية: مقدمة بسيطة للمكتبة القياسية المدمجة في Go، لأن محتوى المكتبة القياسية ضخم جداً فالتحديث حسب التوفر.
    • مبادئ التنفيذ: يشرح بشكل أساسي بعض مبادئ التصميم الداخلية للغة Go، مثل جدولة الكوروتين، وإدارة الذاكرة، وجمع المهملات وغيرها.
  • بيئة المجتمع: يشرح بشكل أساسي البيئة المحيطة بـ Go، أكثر تطبيقية.

انتقل إلى الاستعداد للبدء للبدء في التعلم

Golang تم تحريره بواسطة www.golangdev.cn