لغة البرمجة Go

لغة Go هي لغة برمجة عالية المستوى ومتعددة الأغراض ، ذات كتابة ثابتة ومترجمة . تشتهر ببساطة تركيبها النحوي وكفاءة التطوير التي تتيحها من خلال تضمين مكتبة قياسية ضخمة تلبي العديد من احتياجات المشاريع الشائعة. [ 13 ] صُممت في جوجل [ 14 ] عام 2007 على يد روبرت غريسمر ، وروب بايك ، وكين تومسون ، وأُعلن عنها رسميًا في نوفمبر 2009. [ 4 ] تشبه لغة Go تركيبيًا لغة C ، ولكنها تتميز أيضًا بجمع البيانات المهملة ، والكتابة الهيكلية ، [ 8 ] والتزامن على نمط CSP . [ 15 ] يُشار إليها غالبًا باسم Golang لتجنب الالتباس، ونظرًا لاسم نطاقها السابق، إلا أن اسمها الصحيح هو Go. [ 16 ]golang.org

هناك تطبيقان رئيسيان:

يقوم برنامج GopherJS، وهو مترجم من المصدر إلى المصدر تابع لجهة خارجية ، [ 22 ] بتحويل لغة Go إلى JavaScript لتطوير واجهة المستخدم الأمامية للويب .

تاريخ

صُممت لغة البرمجة Go في جوجل عام 2007 لتحسين إنتاجية البرمجة في عصر المعالجات متعددة النوى ، والآلات المتصلة بالشبكة، وقواعد البيانات الضخمة . [ 23 ] أراد المصممون معالجة الانتقادات الموجهة للغات الأخرى المستخدمة في جوجل، مع الحفاظ على خصائصها المفيدة: [ 24 ]

كان الدافع الرئيسي لمصمميها هو كراهيتهم المشتركة للغة C++ . [ 26 ] [ 27 ] [ 28 ]

تم الإعلان عن لغة Go علنًا في نوفمبر 2009، [ 29 ] وتم إصدار الإصدار 1.0 في مارس 2012. [ 30 ] [ 31 ] يتم استخدام Go على نطاق واسع في الإنتاج في Google [ 32 ] وفي العديد من المنظمات الأخرى ومشاريع المصادر المفتوحة.

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

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

العلامة التجارية والتصميم

رسمة لشعار لعبة غو، وهو حيوان غوفر كرتوني .

تم تقديم تميمة الغوفر في عام 2009 بالتزامن مع إطلاق اللغة مفتوحة المصدر . رينيه فرينش ، التي صممت تميمة الأرنب لخطة 9 ، اقتبست الغوفر من تصميم سابق لقميص WFMU . [ 34 ]

في نوفمبر 2016، أصدر مصمما الخطوط تشارلز بيجلو وكريس هولمز خطي Go وGo Mono خصيصًا لمشروع Go. يُعد Go خطًا إنسانيًا بدون زوائد، يشبه Lucida Grande، ولكنه متوافق تقريبًا (وليس كليًا) مع خطي Helvetica و Arial من حيث القياسات المترية . أما Go Mono فهو خط أحادي المسافة . يلتزم كلا الخطين بمجموعة أحرف WGL4 ، وقد صُمما ليكون مقروءًا بوضوح بفضل ارتفاع حرف x الكبير وأشكال الأحرف المميزة . يلتزم كل من Go وGo Mono بمعيار DIN 1450 من خلال وجود الصفر المائل، والأحرف الصغيرة lذات الذيل، والأحرف الكبيرة Iذات الزوائد. [ 35 ] [ 36 ]

في أبريل 2018، أعاد مصمم العلامات التجارية آدم سميث تصميم الشعار الأصلي. الشعار الجديد عبارة عن حرف GO عصري وأنيق مائل إلى اليمين مع خطوط انسيابية ممتدة. وبقي رمز حيوان الغوفر كما هو. [ 37 ]

الأدوية الجنيسة

أثار غياب دعم البرمجة العامة في الإصدارات الأولى من لغة Go انتقادات واسعة. [ 38 ] أبدى المصممون انفتاحًا على البرمجة العامة، وأشاروا إلى أن الدوال المدمجة عامة النوع، ولكنها تُعامل كحالات خاصة؛ ووصف بايك هذا بأنه نقطة ضعف يُمكن تغييرها لاحقًا. [ 39 ] بنى فريق جوجل مُترجمًا واحدًا على الأقل لهجة تجريبية من Go تدعم البرمجة العامة، لكنه لم يُصدرها. [ 40 ]

في أغسطس 2018، نشر المساهمون الرئيسيون في لغة Go مسودات تصميم للبرمجة العامة ومعالجة الأخطاء ، وطلبوا من المستخدمين تقديم ملاحظاتهم. [ 41 ] [ 42 ] ومع ذلك، تم التخلي عن اقتراح معالجة الأخطاء في نهاية المطاف. [ 43 ]

في يونيو 2020، نُشرت مسودة وثيقة تصميم جديدة [ 44 ] تُضيف الصيغة اللازمة إلى لغة Go لتعريف الدوال والأنواع العامة. ووُفِّرت أداة لترجمة الشفرة البرمجية، go2go ، لتمكين المستخدمين من تجربة الصيغة الجديدة، بالإضافة إلى نسخة تدعم الأنواع العامة من منصة Go Playground الإلكترونية. [ 45 ]

تمت إضافة الأنواع العامة أخيرًا إلى لغة Go في الإصدار 1.18 بتاريخ 15 مارس 2022. [ 46 ]

التحكم في الإصدارات

يضمن الإصدار الأول من لغة Go التوافق [ 47 ] مع مواصفات اللغة والأجزاء الرئيسية من المكتبة القياسية. وقد حافظت جميع الإصدارات حتى الإصدار الحالي Go 1.26 [ 48 ] على هذا الوعد.

تستخدم لغة Go go1.[major].[patch]نظام ترقيم الإصدارات، حيث go1.26.0يتم دعم كل إصدار رئيسي من Go حتى صدور إصدارين رئيسيين أحدث. على عكس معظم البرامج، تُطلق Go على الرقم الثاني في الإصدار اسم "الإصدار الرئيسي"، أي أن 2.0 في go1.26.0هو 26الإصدار الرئيسي. [ 49 ] وذلك لأن Go لا تخطط للوصول إلى الإصدار 2.0، إذ تُعطي الأولوية للتوافق مع الإصدارات السابقة على التغييرات التي قد تُسبب أعطالًا. [ 50 ]

تصميم

محاضرة روب بايك (أحد مبتكري لعبة غو) عام 2015

تتأثر لغة غو بلغة سي (وخاصة لهجة بلان 9 [ 51 ] )، ولكن مع التركيز على البساطة والأمان. وهي تتكون من:

بناء الجملة

تتضمن بنية لغة Go تغييرات عن لغة C تهدف إلى الحفاظ على اختصار الكود وسهولة قراءته. تم تقديم عامل مُدمج للإعلان/التهيئة يسمح للمبرمج بكتابة `input` أو `input` دون تحديد أنواع المتغيرات المستخدمة. وهذا يختلف عن `input` و`input` في لغة C (مع أن استنتاج النوع مدعوم منذ C23 باستخدام ` input`، كما هو الحال في C++ ). كما تُزيل Go شرط استخدام الأقواس في شروط العبارات.i:=3s:="Hello, world!"inti=3;char*s="Hello, world!";autoif

لا تزال الفواصل المنقوطة تُستخدم لإنهاء العبارات؛ [ أ ] ولكنها تُعتبر ضمنية عند نهاية السطر. [ ب ]

قد تُعيد الدوال قيمًا متعددة، وتُعدّ إعادة زوج من القيم الطريقة التقليدية التي تُشير بها الدالة إلى وجود خطأ في لغة Go. [ج] تُضيف Go صيغًا حرفية لتهيئة مُعاملات البنية بالاسم، ولتهيئة الخرائط والشرائح . وكبديل لحلقة التكرار ثلاثية العبارات في لغة C ، تُتيح تعابير Go تكرارًا مُختصرًا على المصفوفات والشرائح والسلاسل والخرائط والقنوات. [ 59 ]result,errforrange

الكلمات المفتاحية

تحتوي لغة Go على الكلمات المفتاحية الـ 25 التالية: [ 60 ]

  • break
  • case
  • chan
  • const
  • continue
  • default
  • defer
  • else
  • fallthrough
  • for
  • func
  • go
  • goto
  • if
  • import
  • interface
  • map
  • package
  • range
  • return
  • select
  • struct
  • switch
  • type
  • var

الأنواع

تحتوي لغة Go على عدد من الأنواع المدمجة، بما في ذلك الأنواع العددية (مثل byte`n` int64و`n` float32و`n` وغيرها)، والقيم المنطقية ، وسلاسل البايت ( مثل `string` string). السلاسل غير قابلة للتغيير؛ وتوفر المعاملات والكلمات المفتاحية المدمجة (بدلاً من الدوال) عمليات الربط والمقارنة وتشفير /فك تشفير UTF-8 . [ 61 ] يمكن تعريف أنواع السجلاتstruct باستخدام الكلمة المفتاحية `record`. [ 62 ]

تحتوي لغة Go على العناصر الأولية التالية: [ 63 ]

  • bool
  • int8
  • uint8
  • int16
  • uint16
  • int32
  • uint32
  • int64
  • uint64
  • int
  • uint
  • uintptr
  • float32
  • float64
  • complex64
  • complex128
  • string

لاحظ أن byteهذا اسم بديل لـ uint8و runeهو اسم بديل لـ int32.

لكل نوع Tولكل ثابت صحيح غير سالب n، يوجد نوع مصفوفة يُرمز له بـ [n]T`<T>`؛ وبالتالي، فإن المصفوفات ذات الأطوال المختلفة تُصنف ضمن أنواع مختلفة. تتوفر المصفوفات الديناميكية[]T على شكل "شرائح"، يُرمز لها بـ `<T>` لنوع معين T(قارن بلغات أخرى مثل C/C++ وجافا ، حيث يُرمز للمصفوفات بـ `<T> T[]`). تتميز هذه الشرائح بطول وسعة تحدد متى يلزم تخصيص ذاكرة جديدة لتوسيع المصفوفة. قد تتشارك عدة شرائح في ذاكرتها الأساسية. [ 39 ] [ 64 ] [ 65 ]

تتوفر المؤشراتT لجميع الأنواع، ويُشارإلى المؤشر بالنوع*T(على غرار لغة Rust ؛ قارن ذلك بلغات أخرى مثل C/C++ و C# ، حيث يُشار إلى المؤشرات بالرمزT*). يتم الوصول إلى العناوين والتوجيه غير المباشر باستخدام&`and`*، كما هو الحال في لغة C، أو يتم ذلك ضمنيًا من خلال استدعاء الدالة أو صيغة الوصول إلى السمات. [ 66 ] [ 67 ] لا توجد عمليات حسابية على المؤشرات، [ d ] إلا عبر النوع الخاصunsafe.Pointerفي المكتبة القياسية. [ 68 ]

بالنسبة لزوج من الأنواع K، يُمثل Vالنوع `map` النوع الذي يربط مفاتيح map[K]Vالنوع `map` بقيم النوع `map`، وهو ما يُمكن اعتباره مُكافئًا لـ ` map` في لغات البرمجة الأخرى. لا تُقدم مواصفات لغة البرمجة Go أي ضمانات للأداء أو متطلبات تنفيذ لأنواع الخرائط، على الرغم من أنها تُنفذ عادةً كجدول تجزئة (مُكافئ لـ `map` في لغات البرمجة الأخرى). جداول التجزئة مُدمجة في اللغة، ولها بنية خاصة ووظائف مُدمجة. `map` هي قناة تسمح بإرسال قيم من النوع `map` بين عمليات Go المتزامنة . [ 69 ]KVMap<K, V>HashMap<K, V>chan TT

إلى جانب دعمها للواجهات ، فإن نظام أنواع Go اسمي : typeيمكن استخدام الكلمة المفتاحية `type` لتعريف نوع مُسمى جديد ، وهو نوع مُختلف عن الأنواع المُسماة الأخرى التي لها نفس البنية (في حالة النوع `type` struct، نفس الأعضاء بنفس الترتيب). بعض التحويلات بين الأنواع (مثل التحويلات بين أنواع الأعداد الصحيحة المختلفة) مُعرّفة مُسبقًا، وقد يُؤدي إضافة نوع جديد إلى تعريف تحويلات إضافية، ولكن يجب دائمًا استدعاء التحويلات بين الأنواع المُسماة بشكل صريح. [ 70 ] على سبيل المثال، typeيمكن استخدام الكلمة المفتاحية `type` لتعريف نوع لعناوين IPv4 ، استنادًا إلى أعداد صحيحة غير مُوقّعة 32 بت كما يلي:

نوع عنوان IPv4 عدد صحيح غير سالب 32 بت

مع هذا التعريف للنوع، ipv4addr(x)يتم تفسير uint32القيمة xعلى أنها عنوان IP. إن مجرد إسناد قيمة xإلى متغير من هذا النوع ipv4addrيُعد خطأً في النوع. [ 71 ]

قد تكون التعبيرات الثابتة إما ذات نوع محدد أو "بدون نوع محدد"؛ ويتم تحديد نوعها عند إسنادها إلى متغير ذي نوع محدد إذا اجتازت القيمة التي تمثلها فحص وقت الترجمة. [ 72 ]

تُحدد أنواع الدوالfunc بالكلمة المفتاحية؛ فهي تأخذ صفرًا أو أكثر من المعاملات وتُرجع صفرًا أو أكثر من القيم، وكلها مُحددة النوع. يُحدد المعامل والقيمة المُرجعة نوع الدالة؛ وبالتالي،func(string, int32) (int, error)فإن نوع الدوال التي تأخذstringعددًا صحيحًا مُوقّعًا من 32 بت وعددًا صحيحًا مُوقّعًا من 32 بت، وتُرجع عددًا صحيحًا مُوقّعًا (بعرض افتراضي) وقيمة من نوع الواجهة المُدمجةerror. [ 73 ]

لكل نوع مُسمى مجموعة من الدوال المرتبطة به. يمكن توسيع مثال عنوان IP المذكور أعلاه بإضافة دالة للتحقق مما إذا كانت قيمته معيارًا معروفًا.

// تُبلغ دالة ZeroBroadcast عما إذا كان العنوان هو 255.255.255.255. func ( addr ipv4addr ) ZeroBroadcast () bool { return addr == 0xFFFFFFFF }

بسبب التنميط الاسمي، يُضيف تعريف هذه الطريقة طريقةً إلى ipv4addr، ولكن ليس على uint32. على الرغم من أن للطرق تعريفًا خاصًا وبنية استدعاء خاصة، إلا أنه لا يوجد نوع طريقة مميز. [ 74 ]

نظام الواجهة

توفر لغة Go ميزتين تحلان محل وراثة الفئات .

أولها التضمين ، والذي يمكن اعتباره شكلاً آلياً من أشكال التركيب . [ 75 ]

ثانيًا، واجهاتها ، التي توفر تعدد الأشكال أثناء التشغيل . [ 76 ] : 266. الواجهات هي فئة من الأنواع، وتوفر شكلًا محدودًا من الكتابة الهيكلية في نظام الأنواع الاسمي للغة Go. الكائن الذي ينتمي إلى نوع واجهة يكون أيضًا من نوع آخر، تمامًا مثل كائنات C++ التي تنتمي في الوقت نفسه إلى فئة أساسية ومشتقة. استُلهم تصميم واجهات Go من بروتوكولات لغة البرمجة Smalltalk. [ 77 ] تستخدم مصادر متعددة مصطلح " الكتابة الديناميكية" عند وصف واجهات Go. [ 78 ] [ 79 ] على الرغم من أن مصطلح "الكتابة الديناميكية" غير مُعرَّف بدقة، وبالتالي ليس خاطئًا، إلا أنه يشير عادةً إلى عدم التحقق من مطابقة النوع بشكل ثابت. نظرًا لأن مطابقة واجهة Go يتم التحقق منها بشكل ثابت بواسطة مُصرِّف Go (باستثناء عند إجراء تأكيد النوع)، يُفضِّل مُطوِّرو Go مصطلح " الكتابة الهيكلية" . [ 80 ]

يُعرّف نوع الواجهة بقائمة من الطرق المطلوبة، مُصنّفة حسب الاسم والنوع. أي كائن من النوع T توجد له دوال تُطابق جميع الطرق المطلوبة لنوع الواجهة I، هو كائن من النوع I أيضًا. لا يُشترط (ولا يُمكن) أن يُحدد تعريف النوع T النوع I. على سبيل المثال، إذا Shapeتم تعريف Squareو و على النحو التالي:Circle

استيراد "الرياضيات"نوع واجهة الشكل { المساحة () عدد عشري 64 بت }// ملاحظة: لا يوجد تعريف "implements" من نوع Square struct { side float64 }func ( sq Square ) Area () float64 { return sq . side * sq . side }// لا يوجد تعريف "implements" هنا أيضًا type Circle struct { radius float64 }func ( c Circle ) Area ( ) float64 { return math.Pi * math.Pow ( c.radius , 2 ) }

عندئذٍ، يُعتبر كلٌّ من a Squareو a Circleضمنيًا من النوع a، Shapeويمكن إسنادهما إلى Shapeمتغير من النوع a. [ 76 ] : 263-268. في اللغة الرسمية، يوفر نظام الواجهات في لغة Go تصنيفًا بنيويًا بدلًا من التصنيف الاسمي . يمكن للواجهات تضمين واجهات أخرى، مما يؤدي إلى إنشاء واجهة مُدمجة تُلبّيها بالضبط الأنواع التي تُنفّذ الواجهة المُضمّنة، بالإضافة إلى أي طرق تُضيفها الواجهة المُعرّفة حديثًا. [ 76 ] : 270

تستخدم مكتبة Go القياسية واجهات لتوفير العمومية في عدة مواضع، بما في ذلك نظام الإدخال/الإخراج الذي يعتمد على مفاهيم Readerو Writer. [ 76 ] : 282-283

إلى جانب استدعاء الدوال عبر الواجهات، تسمح لغة Go بتحويل قيم الواجهات إلى أنواع أخرى باستخدام فحص النوع أثناء التشغيل. وتتمثل بنيات اللغة المستخدمة في ذلك في تأكيد النوع [ 81 ] ، الذي يتحقق من نوع واحد محتمل.

var shp Shape = Square { 5 } square , ok := shp .( Square ) // يتحقق من أن نوع الشكل مربع، يجب أن يعمل إذا كان ok { fmt . Printf ( "%#v\n" , square ) } else { fmt . Println ( "لا يمكن طباعة الشكل كمربع" ) }

ومفتاح النوع ، [ 82 ] الذي يتحقق من أنواع متعددة:

دالة ( مربع ) قطري () عدد عشري 64 { إرجاع مربع.الضلع * جذر 2 } دالة ( دائرة ) قطر ( ) عدد عشري 64 { إرجاع 2 * نصف قطر الدائرة }func LongestContainedLine ( shp Shape ) float64 { switch v := shp .( type ) { case Square : return v.Diagonal ( ) // أو، مع تأكيد النوع، shp.(Square).Diagonal() case Circle : return v.Diameter ( ) // أو، مع تأكيد النوع، shp.(Circle).Diameter() default : return 0 // عمليًا، يجب التعامل مع هذا الأمر مع الأخطاء } }

تُعدّ الواجهة الفارغة حالة أساسية مهمة لأنها تُتيح الإشارة إلى عنصر من أي نوع مُحدد. وهي تُشبه الفئة في لغات Java أو C# أو C أو C ++ أو Rust ، وتُلبّيها أي نوع، بما في ذلك الأنواع المُضمّنة . [ 76 ] : 284 لا يُمكن للبرنامج الذي يستخدم الواجهة الفارغة استدعاء الدوال (أو المعاملات المُضمّنة) على الكائن المُشار إليه ببساطة، ولكنه يُمكنه تخزين القيمة ، أو محاولة تحويلها إلى نوع أكثر فائدة عبر تأكيد النوع أو تبديل النوع، أو فحصها باستخدام حزمة Go. [ 83 ] ولأنها تُتيح الإشارة إلى أي قيمة، فهي طريقة محدودة لتجاوز قيود الكتابة الثابتة، كما هو الحال في لغة C ولكن مع عمليات فحص إضافية للأنواع أثناء التشغيل.interface{}Objectvoid*Anyintinterface{}reflectinterface{}void*

يمكن استخدام هذا النوع لنمذجة البيانات المهيكلة لأي مخطط في لغة Go، مثل بيانات JSON أو YAML ، وذلك بتمثيلها كـ (خريطة من سلسلة نصية إلى واجهة فارغة). يصف هذا النوع البيانات بشكل متكرر على هيئة قاموس بمفاتيح نصية وقيم من أي نوع. [ 84 ]interface{}map[string]interface{}

تُنفَّذ قيم الواجهة باستخدام مؤشر إلى البيانات ومؤشر ثانٍ إلى معلومات نوع وقت التشغيل. [ 85 ] ومثل بعض الأنواع الأخرى المُنفَّذة باستخدام المؤشرات في لغة Go، تكون قيم الواجهة nilغير مُهيَّأة. [ 86 ]

الكود العام باستخدام الأنواع ذات المعاملات

منذ الإصدار 1.18، تدعم لغة Go التعليمات البرمجية العامة باستخدام الأنواع ذات المعاملات. [ 87 ]

أصبح بإمكان الدوال والأنواع الآن أن تكون عامة باستخدام معلمات النوع. تُحدد هذه المعلمات بين قوسين مربعين، مباشرةً بعد اسم الدالة أو النوع. [ 88 ] يقوم المترجم بتحويل الدالة أو النوع العام إلى نوع غير عام عن طريق استبدال وسيطات النوع بمعلمات النوع المُقدمة، إما صراحةً من قِبل المستخدم أو استنتاج النوع من قِبل المترجم. [ 89 ] تُعرف عملية التحويل هذه باسم إنشاء النوع. [ 90 ]

يمكن الآن للواجهات تعريف مجموعة من الأنواع (تُعرف باسم مجموعة الأنواع) باستخدام |عامل (الاتحاد)، بالإضافة إلى مجموعة من الطرق. أُجريت هذه التغييرات لدعم قيود الأنواع في الشيفرة العامة. بالنسبة لدالة أو نوع عام، يمكن اعتبار القيد بمثابة نوع وسيط النوع: نوع فوقي. ~Tستكون هذه الصيغة الجديدة أول استخدام ~لـ كرمز في لغة Go. ~Tتعني مجموعة جميع الأنواع التي يكون نوعها الأساسي هو T. [ 91 ]

واجهة نوع الرقم { ~ int | ~ float64 | ~ float32 | ~ int32 | ~ int64 }دالة جمع [ T رقم ]( أعداد ... T ) T { متغير المجموع T لـ _ ، v := نطاق الأعداد { المجموع += v } إرجاع المجموع }func main () { add := Add [ int ] // إنشاء النوع println ( add ( 1 , 2 , 3 , 4 , 5 )) // 15res := Add ( 1.1 , 2.2 , 3.3 , 4.4 , 5.5 ) // استنتاج النوع println ( res ) // +1.650000e+001 }

أنواع مُعَدَّة

تستخدم لغة Go iotaالمعرف لإنشاء الثوابت المُعدّدة. [ 92 ] [ 93 ]

نوع حجم البايت intconst ( _ = iota // تجاهل القيمة الأولى بتعيينها لمعرف فارغ؛ 0 كيلوبايت ByteSize = 1 << ( 10 * iota ) // 1 << (10 * 1) == 1 << 10 == 1024؛ بالثنائي 10000000000 ميجابايت // 1 << (10 * 2) == 1048576؛ بالثنائي 1000000000000000000000 جيجابايت // 1 << (10 * 3) == 1073741824؛ بالثنائي 100000000000000000000000000000 )

نظام التغليف

في نظام الحزم في لغة Go، لكل حزمة مسار (مثلاً، "compress/bzip2"أو "golang.org/x/net/html") واسم (مثلاً، bzip2أو html). افتراضياً، يجب أن تُسبق تعريفات الحزم الأخرى باسم الحزمة الأخرى. مع ذلك، يمكن تغيير الاسم المستخدم من اسم الحزمة، وإذا تم استيرادها كـ _، فلا يلزم إضافة بادئة للحزمة. لا يمكن الوصول إلا إلى الأسماء المكتوبة بأحرف كبيرةio.Reader من الحزم الأخرى: عام، بينما bzip2.readerخاص. [ 94 ] يمكن للأمر go getاسترداد الحزم المخزنة في مستودع بعيد [ 95 ويُنصح المطورون بتطوير الحزم داخل مسار أساسي يتوافق مع مستودع المصدر (مثل example.com/user_name/package_name) لتقليل احتمالية تضارب الأسماء مع الإضافات المستقبلية للمكتبة القياسية أو المكتبات الخارجية الأخرى. [ 96 ]

التزامن: الروتينات الفرعية والقنوات

مؤتمر دوت جو 2015 - مات أيمونيتي - تطبيق التزامن في لغة جو

تتمتع لغة Go بإمكانيات مدمجة، بالإضافة إلى دعم المكتبات، لكتابة برامج متزامنة . بيئة التشغيل غير متزامنة : يتم تعليق تنفيذ البرنامج الذي يقوم، على سبيل المثال، بقراءة بيانات من الشبكة حتى تتوفر البيانات للمعالجة، مما يسمح لأجزاء أخرى من البرنامج بأداء مهام أخرى. هذه الميزة مدمجة في بيئة التشغيل ولا تتطلب أي تغييرات في كود البرنامج. كما تقوم بيئة تشغيل Go تلقائيًا بجدولة العمليات المتزامنة (الروتينات الفرعية) عبر وحدات معالجة مركزية متعددة؛ وهذا ما يمكن أن يحقق التوازي لبرنامج مكتوب بشكل صحيح. [ 97 ]

البنية الأساسية للتزامن هي الروتين الفرعي (goroutine) ، وهو نوع من الخيوط الخضراء . [ 98 ] : 280-281. يبدأ استدعاء دالة مسبوقة بالكلمة goالمفتاحية `goroutine` دالةً في روتين فرعي جديد. لا تحدد مواصفات اللغة كيفية تنفيذ الروتينات الفرعية، لكن التطبيقات الحالية تُوزّع روتينات عملية Go الفرعية على مجموعة أصغر من خيوط نظام التشغيل ، على غرار الجدولة المُطبقة في Erlang وتنفيذ وقت تشغيل مُصرّف Glasgow Haskell ( GHC) الخاص بـ Haskell . [ 99 ] : 10

على الرغم من توفر حزمة مكتبة قياسية تضم معظم هياكل التحكم بالتزامن الكلاسيكية ( أقفال التزامن ، إلخ)، [ 99 ] : 151-152، فإن البرامج المتزامنة الاصطلاحية تفضل استخدام القنوات ، التي ترسل الرسائل بين العمليات الفرعية. [ 100 ] تخزن المخازن المؤقتة الاختيارية الرسائل بترتيب FIFO [ 101 ] : 43 وتسمح للعمليات الفرعية المرسلة بالمضي قدمًا قبل استلام رسائلها. [ 98 ] : 233

تُصنَّف القنوات حسب النوع، بحيث لا يمكن استخدام قناة من نوع معين chan Tإلا لنقل رسائل من نوع معين T. تُستخدم صيغة خاصة للتعامل معها؛ <-chحيث يُمثل تعبيرًا يجعل الروتين الفرعي قيد التنفيذ يتوقف حتى وصول قيمة عبر القناة ch، بينما ch <- xيُرسل القيمة x(مع احتمال توقفه حتى يستقبل روتين فرعي آخر القيمة). يمكن استخدام العبارة switchالمضمنة الشبيهة selectبتنفيذ اتصال غير متزامن على قنوات متعددة؛ انظر المثال أدناه . تمتلك لغة Go نموذج ذاكرة يصف كيفية استخدام الروتينات الفرعية للقنوات أو عمليات أخرى لمشاركة البيانات بأمان. [ 102 ]

لا يُميّز وجود القنوات في حد ذاته لغة Go عن لغات البرمجة المتزامنة التي تعتمد على نموذج الممثل، مثل Erlang، حيث تُوجّه الرسائل مباشرةً إلى الممثلين (المقابلين للروتينات الفرعية). في نموذج الممثل، تُعتبر القنوات نفسها ممثلين، وبالتالي فإنّ توجيه رسالة إلى قناة يعني ببساطة توجيهها إلى ممثل. يُمكن محاكاة أسلوب الممثل في Go من خلال الحفاظ على تطابق واحد لواحد بين الروتينات الفرعية والقنوات، ولكن اللغة تسمح لعدة روتينات فرعية بمشاركة قناة واحدة، أو لروتين فرعي واحد بالإرسال والاستقبال عبر قنوات متعددة. [ 99 ] : 147

باستخدام هذه الأدوات، يمكن بناء هياكل متزامنة مثل مجموعات العمال ، وخطوط الأنابيب (حيث يتم، على سبيل المثال، فك ضغط ملف وتحليله أثناء تنزيله)، واستدعاءات الخلفية مع مهلة زمنية، واستدعاءات متوازية "موزعة" لمجموعة من الخدمات، وغيرها. [ 103 ] كما وُجدت للقنوات استخدامات تتجاوز المفهوم المعتاد للتواصل بين العمليات، مثل العمل كقائمة آمنة للتزامن من المخازن المؤقتة المعاد تدويرها، [ 104 ] وتنفيذ الروتينات الفرعية (التي ساهمت في إلهام اسم goroutine[ 105 ] وتنفيذ المكررات . [ 106 ]

تُستمدّ الاصطلاحات الهيكلية المتعلقة بالتزامن في لغة Go ( القنوات ومدخلات القنوات البديلة) من نموذج العمليات المتسلسلة المتصلة لتوني هوار . على عكس لغات البرمجة المتزامنة السابقة مثل Occam أو Limbo (وهي لغة عمل عليها روب بايك، أحد مصممي Go)، [ 107 ] لا توفر Go أي مفهوم مُدمج للتزامن الآمن أو القابل للتحقق. [ 108 ] مع أن نموذج العمليات المتصلة هو المُفضّل في Go، إلا أنه ليس النموذج الوحيد: فجميع الروتينات الفرعية (goroutines) في البرنامج تشترك في مساحة عنوان واحدة. هذا يعني أنه يُمكن مشاركة الكائنات والمؤشرات القابلة للتغيير بين الروتينات الفرعية؛ انظر § " انعدام أمان تضارب البيانات" أدناه. 

مناسب للبرمجة المتوازية

على الرغم من أن ميزات التزامن في لغة Go لا تستهدف في المقام الأول المعالجة المتوازية ، [ 97 ] إلا أنه يمكن استخدامها لبرمجة أجهزة متعددة المعالجات ذات ذاكرة مشتركة . وقد أُجريت دراسات عديدة حول فعالية هذا النهج. [ 109 ] قارنت إحدى هذه الدراسات حجم (عدد أسطر التعليمات البرمجية ) وسرعة البرامج التي كتبها مبرمج متمرس غير مُلم باللغة، مع تصحيحات أجراها خبير في لغة Go (من فريق تطوير جوجل) لهذه البرامج، وذلك باستخدام Chapel و Cilk و Intel TBB . وخلصت الدراسة إلى أن المبرمج غير الخبير كان يميل إلى كتابة خوارزميات فرق تسد باستخدام عبارة واحدة لكل استدعاء ذاتي، بينما كتب الخبير برامج توزيع العمل والمزامنة باستخدام روتين فرعي واحد لكل نواة معالج. وكانت برامج الخبير عادةً أسرع، ولكنها أطول أيضًا. [ 110 ]go

نقص بيانات سلامة السباق

يمكن تلخيص نهج لغة Go في التزامن بعبارة "لا تتواصل بمشاركة الذاكرة، بل شارك الذاكرة بالتواصل". [ 111 ] لا توجد قيود على كيفية وصول الروتينات الفرعية (goroutines) إلى البيانات المشتركة، مما يجعل تضارب البيانات ممكنًا. تحديدًا، ما لم يقم البرنامج بالمزامنة صراحةً عبر القنوات أو وسائل أخرى، فقد تكون عمليات الكتابة من روتين فرعي واحد مرئية جزئيًا أو كليًا أو غير مرئية على الإطلاق لروتين فرعي آخر، وغالبًا دون أي ضمانات بشأن ترتيب عمليات الكتابة. [ 108 ] علاوة على ذلك، فإن هياكل البيانات الداخلية في Go ، مثل قيم الواجهة، ورؤوس الشرائح، وجداول التجزئة، ورؤوس السلاسل النصية، ليست محصنة ضد تضارب البيانات، لذا يمكن انتهاك سلامة النوع والذاكرة في البرامج متعددة الخيوط التي تُعدّل مثيلات مشتركة من تلك الأنواع دون مزامنة. [ 112 ] [ 113 ] وبالتالي، بدلًا من دعم اللغة، تعتمد البرمجة المتزامنة الآمنة على الاصطلاحات. على سبيل المثال، يوصي تشيسنال بمصطلح يُسمى "الأسماء المستعارة xor القابلة للتغيير"، ما يعني أن تمرير قيمة قابلة للتغيير (أو مؤشر) عبر قناة ما يُشير إلى نقل ملكية القيمة إلى مُستقبِلها. [ 99 ] : 155. تحتوي مجموعة أدوات gc على كاشف تضارب بيانات اختياري يُمكنه التحقق من الوصول غير المتزامن إلى الذاكرة المشتركة أثناء وقت التشغيل منذ الإصدار 1.1، [ 114 ] بالإضافة إلى ذلك، يتم تضمين كاشف تضارب بأفضل جهد افتراضيًا منذ الإصدار 1.6 من وقت تشغيل gc للوصول إلى mapنوع البيانات. [ 115 ]

ثنائي

يقوم الرابط في سلسلة أدوات gc بإنشاء ملفات ثنائية مرتبطة بشكل ثابت افتراضيًا؛ لذلك، تتضمن جميع ملفات Go الثنائية بيئة تشغيل Go. [ 116 ] [ 117 ]

الإغفالات

تتجاهل لغة Go عمدًا بعض الميزات الشائعة في لغات أخرى، بما في ذلك (التنفيذ)  الوراثة ، والتأكيدات ، [ هـ ] حساب المؤشرات ، [ د ] تحويلات الأنواع الضمنية ، والاتحادات غير الموسومة ، [ و ] والاتحادات الموسومة . [ ز ] أضاف المصممون فقط تلك الميزات التي اتفق عليها الثلاثة جميعًا. [ 120 ]

من بين ميزات اللغة المحذوفة، يعارض المصممون صراحةً استخدام التأكيدات وحسابات المؤشرات، بينما يدافعون عن اختيار حذف وراثة الأنواع باعتبارها تُنتج لغةً أكثر فائدة، ويشجعون بدلاً من ذلك على استخدام الواجهات لتحقيق التوزيع الديناميكي [ h ] والتركيب لإعادة استخدام التعليمات البرمجية. في الواقع، يتم أتمتة التركيب والتفويض إلى حد كبير عن طريق التضمين؛ ووفقًا للباحثين شماجر وآخرون ، فإن هذه الميزة "تتضمن العديد من عيوب الوراثة: فهي تؤثر على الواجهة العامة للكائنات، وليست دقيقة (أي لا يوجد تحكم على مستوى الأسلوب في التضمين)، ولا يمكن إخفاء أساليب الكائنات المضمنة، وهي ثابتة"، مما يجعل من "غير الواضح" ما إذا كان المبرمجون سيفرطون في استخدامها بالقدر الذي يُشاع أن المبرمجين في لغات أخرى يفرطون فيه في استخدام الوراثة. [ 75 ]struct

في البداية، تم إهمال معالجة الاستثناءات في لغة Go بسبب عدم وجود "تصميم يُعطي قيمة تتناسب مع التعقيد". [ 121 ] ثم اقتُرحت آلية مشابهة للاستثناءات panicتتجنب recoverبنية التحكم المعتادة [ 122 ] ، وتم إصدارها في نسخة 30 مارس 2010. [ 123 ] ينصح مطورو Go باستخدامها للأخطاء غير القابلة للاسترداد، مثل تلك التي تستدعي إيقاف برنامج كامل أو طلب خادم، أو كاختصار لنشر الأخطاء عبر مكدس الاستدعاءات داخل الحزمة. [ 124 ] [ 125 ] وبغض النظر عن حدود الحزم، تتضمن Go نوع خطأ معياري، وتُعدّ عمليات الإرجاع متعددة القيم باستخدام هذا النوع هي الأسلوب القياسي. [ 4 ]try-catch

أسلوب

بذل مؤلفو لغة Go جهودًا كبيرة في التأثير على أسلوب برامج Go:

  • تُوحّد الأداة تلقائيًا المسافات البادئة والتباعد وتفاصيل أخرى سطحية في الكود gofmt. وتستخدم علامات الجدولة للمسافات البادئة والفراغات للمحاذاة. وتفترض المحاذاة أن المحرر يستخدم خطًا ثابت العرض. [ 126 ]golint تُجري فحوصات إضافية للنمط تلقائيًا، ولكن تم إيقافها وأرشفتها من قِبل القائمين على صيانة لغة Go. [ 127 ]
  • تقترح الأدوات والمكتبات الموزعة مع Go مناهج قياسية لأشياء مثل توثيق واجهة برمجة التطبيقات ( godoc[ 128 ] الاختبار ( go test)، البناء ( go build)، إدارة الحزم ( go get)، وما إلى ذلك.
  • يفرض Go قواعد هي توصيات في لغات أخرى، على سبيل المثال حظر التبعيات الدورية، والمتغيرات غير المستخدمة [ 129 ] أو عمليات الاستيراد، [ 130 ] وتحويلات الأنواع الضمنية.
  • إن حذف بعض الميزات (على سبيل المثال، اختصارات البرمجة الوظيفية مثل كتل نمط mapجافا ) يميل إلى تشجيع أسلوب برمجة صريح وملموس وحتمي معين.tryfinally
  • في اليوم الأول، نشر فريق Go مجموعة من مصطلحات Go، [ 128 ] وقام لاحقًا أيضًا بجمع تعليقات مراجعة التعليمات البرمجية، [ 131 ] والمحادثات، [ 132 ] ومنشورات المدونة الرسمية [ 133 ] لتعليم أسلوب Go وفلسفة البرمجة.

أدوات

تتضمن حزمة توزيع Go الرئيسية أدوات لبناء واختبار وتحليل التعليمات البرمجية :

  • go build، الذي يقوم بإنشاء ملفات Go الثنائية باستخدام المعلومات الموجودة في ملفات المصدر نفسها فقط، دون الحاجة إلى ملفات makefile منفصلة.
  • go test، لاختبار الوحدات والقياسات الدقيقة بالإضافة إلى اختبار التشويش
  • go fmt، لتنسيق التعليمات البرمجية
  • go install، لاسترداد وتثبيت الحزم البعيدة
  • go vet، محلل ثابت يبحث عن الأخطاء المحتملة في الكود
  • go run، اختصار لبناء وتنفيذ التعليمات البرمجية
  • go doc، لعرض الوثائق
  • go generate، طريقة قياسية لاستدعاء مولدات التعليمات البرمجية
  • go mod، لإنشاء وحدة نمطية جديدة، وإضافة التبعيات، وترقية التبعيات، وما إلى ذلك.
  • go tool، لاستدعاء أدوات المطورين (تمت إضافتها في إصدار Go 1.24)

كما يتضمن دعمًا لتحليل الأداء وتصحيح الأخطاء ، وقدرات اختبار عشوائي لاكتشاف الأخطاء، وأدوات وقت التشغيل (على سبيل المثال، لتتبع فترات توقف جمع البيانات المهملة )، وكاشف تضارب البيانات .

أداة أخرى يديرها فريق Go ولكنها غير مضمنة في توزيعات Go هي goplsخادم اللغة الذي يوفر ميزات بيئة التطوير المتكاملة مثل الإكمال الذكي للتعليمات البرمجية للمحررات المتوافقة مع بروتوكول خادم اللغة . [ 134 ]

تُضاف مجموعة من أدوات الطرف الثالث إلى التوزيع القياسي، مثل gocode، والتي تُمكّن الإكمال التلقائي للتعليمات البرمجية في العديد من محررات النصوص، goimportsو ، والتي تُضيف/تُزيل استيرادات الحزم تلقائيًا حسب الحاجة، و errcheck، والتي تكتشف التعليمات البرمجية التي قد تتجاهل الأخطاء عن غير قصد.

أمثلة

مرحبا بالعالم

الحزمة الرئيسيةاستيراد "fmt"func main () { fmt . Println ( "hello world" ) }

حيث أن "fmt" هي حزمة الإدخال/الإخراج المنسق ، على غرار <stdio.h> في لغة C أو <print> في لغة C++ . [ 135 ]

التزامن

يُوضح البرنامج البسيط التالي ميزات التزامن في لغة Go لتنفيذ برنامج غير متزامن. يُشغّل البرنامج خيطين خفيفين ("goroutines"): أحدهما ينتظر كتابة المستخدم لنص ما، بينما يُنفّذ الآخر مهلة زمنية. تنتظر عبارة select إرسال رسالة من أيٍّ من هذين الخيطين إلى البرنامج الرئيسي، وتنفّذ الإجراء بناءً على أول رسالة تصل (مثال مُقتبس من كتاب ديفيد تشيسنال). [ 99 ] : 152

الحزمة الرئيسيةاستيراد ( "fmt" "time" )func readword ( ch chan string ) { fmt.Println ( " اكتب كلمة، ثم اضغط على Enter." ) var word string fmt.Scanf ( " %s" , & word ) ch < - word }دالة timeout ( t chan bool ) { time . Sleep ( 5 * time . Second ) t <- false }func main () { t := make ( chan bool ) go timeout ( t )ch := make ( chan string ) go readword ( ch )select { case word := <- ch : fmt . Println ( "تم الاستلام" , word ) case <- t : fmt . Println ( "انتهت المهلة." ) } }

الاختبار

توفر حزمة الاختبار دعمًا للاختبار الآلي لحزم Go. [ 136 ] مثال على دالة الهدف:

دالة استخراج اسم المستخدم ( البريد الإلكتروني سلسلة نصية ) سلسلة نصية { at : = strings.Index ( البريد الإلكتروني ، "@" ) إرجاع البريد الإلكتروني [: at ] }

كود الاختبار (لاحظ أن الكلمة المفتاحية assert غير موجودة في لغة Go؛ توجد الاختبارات في <filename>_test.go في نفس الحزمة):

استيراد ( "اختبار" )func TestExtractUsername ( t * testing.T ) { t.Run ( "withoutDot" , func ( t * testing.T ) { username := ExtractUsername ( " r@google.com" ) if username ! = "r" { t.Fatalf ( " Got : %v\ n " , username ) } } )t.Run ( " withDot " , func ( t * testing.T ) { username := ExtractUsername ( "jonh.smith@example.com" ) if username != "jonh.smith" { t.Fatalf ( " Got: %v\ n " , username ) } } ) }

من الممكن إجراء الاختبارات بالتوازي.

تطبيق ويب

توفر حزمة net /http [ 137 ] الدعم لإنشاء تطبيقات الويب.

سيُظهر هذا المثال عبارة "Hello world!" عند زيارة localhost:8080.

الحزمة الرئيسيةاستيراد ( "fmt" "log" "net/http" )func helloFunc ( w http.ResponseWriter , r * http.Request ) { fmt.Fprintf ( w , " Hello world ! " ) }func main () { http.HandleFunc ( " / " , helloFunc ) log.Fatal ( http.ListenAndServe ( " : 8080 " , nil ) ) }

التطبيقات

لقد حظيت لغة البرمجة Go بانتشار واسع في مختلف المجالات بفضل مكتبتها القياسية القوية وسهولة استخدامها. [ 138 ]

تشمل التطبيقات الشائعة ما يلي:

  • Caddy — خادم ويب يقوم بأتمتة عملية إعداد HTTPS [ 139 ]
  • Docker - منصة للحاويات، تهدف إلى تسهيل تعقيدات تطوير البرمجيات ونشرها [ 140 ]
  • Kubernetes — يقوم بأتمتة نشر وتوسيع وإدارة التطبيقات المعبأة في حاويات [ 141 ]
  • CockroachDB — قاعدة بيانات SQL موزعة مصممة لتحقيق قابلية التوسع والاتساق القوي [ 142 ]
  • Hugo — مولد مواقع ثابتة يعطي الأولوية للسرعة والمرونة، مما يسمح للمطورين بإنشاء مواقع الويب بكفاءة [ 143 ]
  • TypeScript 7 مكتوب بلغة Go.

استقبال

أشاد ميشيل سيميوناتو بنظام الواجهة، والاستبعاد المتعمد للوراثة، وشبه هذه الخصائص بخصائص لغة Standard ML ، واصفاً إياها بأنها "مؤسفة لعدم اتباع أي لغة شائعة لهذا المسار تحديداً". [ 144 ]

كتب ديف أستلز في إنجن يارد عام 2009: [ 145 ]

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

حصلت لغة البرمجة Go على لقب لغة البرمجة للعام من قِبل مؤشر TIOBE لمجتمع البرمجة في عامها الأول، 2009، وذلك لزيادة شعبيتها بشكل ملحوظ خلال 12 شهرًا فقط (بعد إطلاقها في نوفمبر) مقارنةً بأي لغة أخرى في ذلك العام، ووصلت إلى المركز الثالث عشر بحلول يناير 2010، [ 146 ] متجاوزةً لغات راسخة مثل باسكال . وبحلول يونيو 2015، انخفض ترتيبها إلى ما دون المركز الخمسين في المؤشر، لتصبح أدنى من لغتي كوبول وفورتران . [ 147 ] ولكن اعتبارًا من يناير 2017، قفز ترتيبها إلى المركز الثالث عشر، مما يشير إلى نمو كبير في شعبيتها وانتشارها. وحصلت Go مرة أخرى على جائزة TIOBE للغة البرمجة للعام في عام 2016. [ 148 ]

صرح بروس إيكل بما يلي: [ 149 ]

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

توصل تقييم أجراه مهندس من جوجل عام 2011 للغة وتنفيذها لجامع البيانات المهملة (gc) مقارنةً بلغة C++ ( GCC ) وجافا وسكالا إلى النتائج التالية:

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

ر. هوندت [ 150 ]

تلقى التقييم ردًا من فريق تطوير لغة Go. لم يكن إيان لانس تايلور، الذي حسّن كود Go لورقة هوندت البحثية، على علم بنية نشر كوده، ويقول إن نسخته "لم تكن تهدف أبدًا إلى أن تكون مثالًا على لغة Go مثالية أو فعّالة"؛ ثم قام روس كوكس بتحسين كود Go، بالإضافة إلى كود C++، وجعل كود Go يعمل بسرعة تقارب سرعة نسخة C++، وأسرع بأكثر من عشرة أضعاف من الكود الموجود في الورقة البحثية. [ 151 ]

  • يؤدي استخدام قيمة nil في لغة Go، بالإضافة إلى عدم وجود أنواع جبرية، إلى صعوبة في التعامل مع حالات الفشل والحالات الأساسية . [ 152 ] [ 153 ]
  • تعرضت لغة Go لانتقادات بسبب تركيزها على سهولة التنفيذ بدلاً من الدقة والمرونة؛ فعلى سبيل المثال، تستخدم اللغة دلالات ملفات POSIX على جميع المنصات، وبالتالي تُقدم معلومات غير صحيحة على منصات مثل Windows (التي لا تتبع المعيار المذكور). [ 154 ] [ 155 ]
  • أظهرت دراسة أن أخطاء التزامن في تمرير الرسائل سهلة بنفس القدر كما هي في الذاكرة المشتركة، بل وأحيانًا أسهل. [ 156 ]

نزاع حول التسمية

في العاشر من نوفمبر/تشرين الثاني 2009، يوم الإطلاق الرسمي للغة، طلب فرانسيس مكابي، مطور لغة البرمجة Go! (لاحظ علامة التعجب)، تغيير اسم لغة جوجل لتجنب الخلط بينها وبين لغته التي أمضى عشر سنوات في تطويرها. [ 157 ] أعرب مكابي عن مخاوفه من أن "الشركة الكبرى ستسحقه" في نهاية المطاف، وقد لاقت هذه المخاوف صدىً لدى أكثر من 120 مطورًا علّقوا على صفحة المشكلات الرسمية في جوجل مطالبين بتغيير الاسم، بل إن بعضهم [ 158 ] أشار إلى أن هذه المشكلة تتعارض مع شعار جوجل: " لا تكن شريرًا ". [ 159 ]

في 12 أكتوبر 2010، أغلق مطور جوجل روس كوكس (@rsc) تذكرة الإصدار العام المقدمة مع وضع علامة "مؤسف" مصحوبة بالتعليق التالي:

"هناك العديد من منتجات وخدمات الحوسبة التي تحمل اسم Go. في الأشهر الـ 11 التي تلت إصدارنا، كان هناك الحد الأدنى من الالتباس بين اللغتين." [ 159 ]

انظر أيضاً

ملحوظات

  1. ولكن "للسماح للعبارات المعقدة بشغل سطر واحد، يمكن حذف الفاصلة المنقوطة قبل علامة الإغلاق ) أو }". [ 57 ]
  2. "إذا جاء سطر جديد بعد رمز يمكن أن ينهي جملة، [سيقوم المحلل اللغوي] بإدراج فاصلة منقوطة". [ 58 ]
  3. عادةً، تكون قيمة واحدة فقط من قيمتي النتيجة والخطأ مختلفة عن القيمة الصفرية للنوع؛ وأحيانًا تكون كلتاهما مختلفة، كما هو الحال عند عدم اكتمال عملية القراءة أو الكتابة بشكل كامل، وأحيانًا لا تكون أي منهما مختلفة، كما هو الحال عند إرجاع عملية القراءة صفر بايت. انظر مشكلة شبه المسند: القيمة المُعادة متعددة القيم .
  4. 1 2 أسئلة وأجوبة حول اللغة "لماذا لا توجد حسابات للمؤشرات؟ الأمان ... لا تستنتج عنوانًا غير قانوني ينجح بشكل خاطئ ... يمكن أن يكون استخدام مؤشرات المصفوفة بنفس كفاءة ... حسابات المؤشرات ... تبسيط تنفيذ جامع البيانات المهملة ...." [ 4 ]
  5. أسئلة وأجوبة حول اللغة "لماذا لا تحتوي لغة Go على تأكيدات؟ ... لقد لاحظنا من خلال تجربتنا أن المبرمجين يستخدمونها كعكاز لتجنب التفكير في معالجة الأخطاء والإبلاغ عنها بشكل صحيح...." [ 4 ]
  6. أسئلة وأجوبة حول اللغة "لماذا لا توجد اتحادات غير موسومة...؟ [إنها] ستنتهك ضمانات سلامة الذاكرة في لغة Go." [ 4 ]
  7. أسئلة وأجوبة حول اللغة "لماذا لا تحتوي لغة Go على أنواع متغيرة؟ ... لقد فكرنا [فيها] لكنها تتداخل بطرق مربكة مع الواجهات .... [و]بعض ما تعالجه الأنواع المتغيرة مغطى بالفعل، ... وإن لم يكن بنفس الأناقة." [ 4 ] (يتم الوصول إلى علامة نوع الواجهة [ 118 ] باستخدام تأكيد النوع [ 119 ] ).
  8. الأسئلة "كيف أحصل على إرسال ديناميكي للأساليب؟" و "لماذا لا يوجد توريث للأنواع؟" في الأسئلة الشائعة للغة. [ 4 ]

مراجع

  1. "Codewalk: First-Class Functions in Go" . تدعم لغة Go الدوال من الدرجة الأولى، والدوال ذات الرتبة العليا، وأنواع الدوال المُعرَّفة من قِبل المستخدم، والقيم الحرفية للدوال، والإغلاقات، وقيم الإرجاع المتعددة. تدعم هذه المجموعة الغنية من الميزات أسلوب البرمجة الوظيفية في لغة ذات كتابة قوية.
  2. "هل لغة Go لغة كائنية التوجه؟" . تم الاطلاع عليه في 13 أبريل 2019. على الرغم من أن لغة Go تحتوي على أنواع وأساليب وتسمح بأسلوب برمجة كائني التوجه، إلا أنه لا يوجد تسلسل هرمي للأنواع .
  3. "Go: كود ينمو مع الرشاقة" . تم الاطلاع عليه في 24 يونيو 2018. لغة Go كائنية التوجه، ولكن ليس بالطريقة المعتادة .
  4. ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ "أسئلة وأجوبة حول تصميم اللغة" . لغة البرمجة Go . ١٦ يناير ٢٠١٠. مؤرشف من الأصل في ٢٨ يوليو ٢٠٢٥. تم الاطلاع عليه في ٢٧ فبراير ٢٠١٠ .
  5. 1 2 "ملف نصي LICENSE" . لغة البرمجة Go . مؤرشف من الأصل في 16 يوليو 2025. تم الاطلاع عليه في 5 أكتوبر 2012 .
  6. "الإصدار 1.26.5" . 7 يوليو 2026. تم الاطلاع عليه في 8 يوليو 2026 .
  7. "مواصفات لغة برمجة Go" . لغة برمجة Go . مؤرشفة من الأصل في 13 أغسطس 2025.
  8. 1 2 "لماذا لا تحتوي لغة البرمجة Go على تعريفات "implements"؟" . لغة البرمجة Go . مؤرشف من الأصل في 28 يوليو 2025. تم الاطلاع عليه في 1 أكتوبر 2015 .
  9. بايك، روب [@rob_pike] (22 ديسمبر 2014). "تعتمد لغة Go على الكتابة الهيكلية، وليس الكتابة الديناميكية. يتم التحقق من استيفاء واجهة المستخدم بالكامل وهو أمر إلزامي" ( تغريدة ). مؤرشفة من الأصل في 7 أبريل 2022. تم الاطلاع عليها في 13 مارس 2016 - عبر تويتر .
  10. "lang/go: go-1.4" . منافذ OpenBSD . 23 ديسمبر 2014. تم الاطلاع عليه في 19 يناير 2015 .
  11. "جهود نقل لغة Go" . موارد لغة Go . cat-v. 12 يناير 2010. تم الاطلاع عليه في 18 يناير 2010 .
  12. «منحة حقوق الملكية الفكرية الإضافية» . لغة البرمجة Go . مؤرشف من الأصل في 30 مارس 2025. تم الاطلاع عليه في 5 أكتوبر 2012 .
  13. "مقدمة حول Go" . www.w3schools.com . تم الاطلاع عليه بتاريخ 23 نوفمبر 2024 .
  14. كينكيد، جيسون (10 نوفمبر 2009). "جو من جوجل: لغة برمجة جديدة تجمع بين بايثون وسي++" . تيك كرانش . تم الاطلاع عليه في 18 يناير 2010 .
  15. ميتز، كيد (5 مايو 2011). "جوجل جو يغامر بالذهاب إلى حيث لم يذهب أي كود من قبل" . ذا ريجستر . مؤرشف من الأصل في 28 يوليو 2025.
  16. " هل تُسمى اللغة Go أم Golang؟" . تم الاطلاع عليه بتاريخ 16 مارس 2022. تُسمى اللغة Go.
  17. " ملاحظات إصدار Go 1.5" . تم الاطلاع عليها بتاريخ 28 يناير 2016. تم الآن تنفيذ المترجم ووقت التشغيل بلغة Go ولغة التجميع، بدون لغة C.
  18. "لغة البرمجة Go" . GitHub . تم الاطلاع عليه في 1 نوفمبر 2024 .
  19. "gofrontend" . GitHub . تم الاطلاع عليه في 1 نوفمبر 2024 .
  20. "gccgo" . تم الاطلاع عليه في 1 نوفمبر 2024. gccgo، مُصرّف GNU للغة البرمجة Go
  21. "Gollvm" . تم الاطلاع عليه في 1 نوفمبر 2024. Gollvm هو مترجم لغة Go قائم على LLVM.
  22. "مترجم من لغة Go إلى JavaScript لتشغيل كود Go في المتصفح: Gopherjs/Gopherjs" . GitHub . مؤرشف من الأصل في 12 ديسمبر 2023.
  23. "انطلق إلى جوجل: تصميم اللغة في خدمة هندسة البرمجيات" . تم الاطلاع عليه بتاريخ 8 أكتوبر 2018 .
  24. بايك، روب (28 أبريل 2010). "محاولة أخرى في تصميم اللغة" . ندوة أنظمة الحاسوب لقسم الهندسة الكهربائية بجامعة ستانفورد . جامعة ستانفورد .الفيديو متاح .
  25. "الأسئلة الشائعة (FAQ) - لغة البرمجة Go" . لغة البرمجة Go . تم ​​الاطلاع عليه بتاريخ 26 فبراير 2016 .
  26. بينستوك، أندرو (18 مايو 2011). "دكتور دوبس: مقابلة مع كين تومسون" . دكتور دوبس . مؤرشف من الأصل في 5 يناير 2013. تم الاطلاع عليه في 7 فبراير 2014 .
  27. بايك، روب (2012). "الأقل هو أكثر بشكل كبير" .
  28. غريسمر، روبرت (2015). "تطور لعبة غو" .
  29. غريسمر، روبرت؛ بايك، روب؛ تومسون، كين؛ تايلور، إيان؛ كوكس، روس؛ كيم، جيني؛ لانغلي، آدم. "هيا! هو! لننطلق!" . جوجل مفتوح المصدر . تم الاسترجاع في 17 مايو 2018 .
  30. شانكلاند، ستيفن (30 مارس 2012). "لغة البرمجة Go من جوجل تُكمل عامها الأول، وتحجز مكانًا لها في يوتيوب: لقد نضجت لغة البرمجة منخفضة المستوى بما يكفي لتحمل رقم الإصدار 1.0. ويتم استخدامها في أعمال حقيقية في جوجل" . أخبار. سي نت . سي بي إس إنتراكتيف . تم الاطلاع عليه في 6 أغسطس 2017. أصدرت جوجل الإصدار الأول من لغة البرمجة Go، وهي محاولة طموحة لتحسين أداء لغات البرمجة منخفضة المستوى الرائدة مثل C وC++.
  31. "تاريخ الإصدارات" . لغة البرمجة Go .
  32. "أسئلة وأجوبة حول لغة Go: هل تستخدم جوجل لغة Go داخليًا؟" . تم الاطلاع عليه في 9 مارس 2013 .
  33. لغة البرمجة Go وبيئتها. منشورات جمعية آلات الحوسبة (ACM). https://dl.acm.org/doi/pdf/10.1145/3488716
  34. "The Go Gopher - The Go Programming Language" . go.dev . تم الاطلاع عليه بتاريخ 9 فبراير 2023 .
  35. "خطوط Go" . Go. 16 نوفمبر 2016. تم الاطلاع عليه في 12 مارس 2019 .
  36. "Go Font TTFs" . GitHub . تم الاطلاع عليه في 2 أبريل 2019 .
  37. "العلامة التجارية الجديدة لشركة Go" . مدونة Go . تم ​​الاطلاع عليه بتاريخ 9 نوفمبر 2018 .
  38. ميريك، أليس (9 مارس 2021). "نتائج استطلاع مطوري لغة Go لعام 2020" . لغة برمجة Go . تم ​​الاطلاع عليه في 16 مارس 2022 .
  39. 1 2 بايك، روب (26 سبتمبر 2013). "المصفوفات، والشرائح (والسلاسل النصية): آليات 'الإلحاق'"" . مدونة جو . تم الاطلاع عليها في 7 مارس 2015 .
  40. ^ "E2E: إريك ماير وروبرت جريسمير" . القناة 9 . مايكروسوفت. 7 مايو 2012.
  41. "Go 2 Draft Designs" . تم الاطلاع عليه بتاريخ 12 سبتمبر 2018 .
  42. "مدونة Go: تصاميم Go 2 Draft" . 28 أغسطس 2018.
  43. "اقتراح: دالة مدمجة للتحقق من الأخطاء في لغة Go، "try"" . مستودع Go على GitHub . تم الاسترجاع في 16 مارس 2022 .
  44. "معلمات النوع - تصميم المسودة" . go.googlesource.com . 
  45. "الأنواع العامة في لغة Go" . bitfieldconsulting.com . 17 ديسمبر 2021.
  46. «تم إصدار Go 1.18!» . لغة برمجة Go . 15 مارس 2022. تم الاطلاع عليه في 16 مارس 2022 .
  47. "Go 1 ومستقبل برامج Go" . لغة برمجة Go .
  48. "ملاحظات إصدار Go 1.26" . لغة برمجة Go .
  49. "تاريخ الإصدارات" . لغة البرمجة Go .
  50. "التوافق مع الإصدارات السابقة، Go 1.21، و Go 2" . لغة برمجة Go .
  51. "دليل سريع لمجمع لغة Go" . go.dev . تم الاطلاع عليه في 31 ديسمبر 2021 .
  52. بايك، روب (10 نوفمبر 2009). "لغة برمجة جو" . يوتيوب . تم الاطلاع عليه في 1 يوليو 2011 .
  53. بايك، روب (10 نوفمبر 2009). لغة البرمجة جو (ملف فيديو) (محاضرة تقنية). جوجل. يبدأ الحدث عند الدقيقة 8:53.
  54. "تنزيل وتثبيت الحزم والتبعيات" .راجع موقع godoc.org للاطلاع على عناوين ووثائق بعض الحزم.
  55. "GoDoc" . godoc.org .
  56. بايك، روب. "سجل التغييرات" (بودكاست). مؤرشف من الأصل في 20 أكتوبر 2013. تم الاطلاع عليه في 7 أكتوبر 2013 .
  57. "مواصفات لغة برمجة Go، §الفاصلة المنقوطة" . لغة برمجة Go .
  58. "Effective Go, §Semicolons" . The Go Programming Language .
  59. "مواصفات لغة البرمجة Go" . لغة البرمجة Go .
  60. "الكلمات المفتاحية والمعرفات في لغة Go" . go101.org . تم الاطلاع عليه بتاريخ 10 أكتوبر 2025 .
  61. بايك، روب (23 أكتوبر 2013). "السلاسل، والبايتات، والرموز، والأحرف في لغة غو" .
  62. دوكسي، كاليب. "الهياكل والواجهات - مقدمة في البرمجة بلغة غو" . www.golang-book.com . مؤرشف من الأصل في 31 ديسمبر 2018. تم الاطلاع عليه في 15 أكتوبر 2018 . 
  63. "نظرة عامة على نظام أنواع Go" . go101.org . تم الاطلاع عليه في 10 أكتوبر 2025 .
  64. جيراند، أندرو. "شرائح Go: الاستخدام والتفاصيل الداخلية" .
  65. مؤلفو لعبة غو. "لعبة غو الفعالة: الشرائح" .
  66. مؤلفو لغة Go. "المحددات" .
  67. مؤلفو لغة Go. "المكالمات" .
  68. "مواصفات لغة برمجة Go، §Package unsafe" . لغة برمجة Go .
  69. "مواصفات لغة البرمجة Go" . go.dev . تم الاطلاع عليه في 31 ديسمبر 2021 .
  70. "مواصفات لغة البرمجة Go" . لغة البرمجة Go .
  71. "جولة في لغة البرمجة Go" . go.dev .
  72. "مواصفات لغة البرمجة Go" . لغة البرمجة Go .
  73. "مواصفات لغة البرمجة Go" . go.dev . تم الاطلاع عليه في 31 ديسمبر 2021 .
  74. "مواصفات لغة البرمجة Go" . لغة البرمجة Go .
  75. 1 2 شماجر، فرانك؛ كاميرون، نيكولاس؛ نوبل، جيمس (2010). GoHotDraw: تقييم لغة البرمجة Go باستخدام أنماط التصميم . تقييم وسهولة استخدام لغات وأدوات البرمجة. ACM.
  76. 1 2 3 4 5 بالبيرت، إيفو (2012). الطريق الأمثل: مقدمة شاملة للغة البرمجة Go . iUniverse.
  77. "تطور لغة غو" . talks.golang.org . تم الاطلاع عليه بتاريخ 13 مارس 2016 .
  78. ديغينز، كريستوفر (24 نوفمبر 2009). "الكتابة البطيئة ولغة برمجة غو" . دكتور دوبز، عالم تطوير البرمجيات . تم الاطلاع عليه في 10 مارس 2016 .
  79. راير، مات (1 ديسمبر 2015). "الكتابة البطيئة في لغة غو" . تم الاسترجاع في 10 مارس 2016 .
  80. "الأسئلة الشائعة (FAQ) - لغة البرمجة Go" . لغة البرمجة Go .
  81. "مواصفات لغة البرمجة Go" . لغة البرمجة Go .
  82. "مواصفات لغة البرمجة Go" . لغة البرمجة Go .
  83. "reflect package" . pkg.go.dev .
  84. "map [ string ] interface{} in Go" . bitfieldconsulting.com . 6 يونيو 2020.
  85. "هياكل بيانات Go: الواجهات" . تم الاطلاع عليه في 15 نوفمبر 2012 .
  86. "مواصفات لغة البرمجة Go" . لغة البرمجة Go .
  87. "ملاحظات إصدار Go 1.18: الأنواع العامة" . لغة برمجة Go . 15 مارس 2022. تم الاطلاع عليه في 16 مارس 2022 .
  88. "اقتراح معلمات النوع" . go.googlesource.com . تم الاطلاع عليه في 25 يونيو 2023 .
  89. "مواصفات لغة برمجة Go - لغة برمجة Go" . go.dev . تم الاطلاع عليه بتاريخ 25 يونيو 2023 .
  90. "مقدمة في البرمجة العامة - لغة البرمجة Go" . go.dev . تم الاطلاع عليه بتاريخ 25 يونيو 2023 .
  91. "اقتراح معلمات النوع" . go.googlesource.com . تم الاطلاع عليه في 25 يونيو 2023 .
  92. "Effective Go" . golang.org . مؤلفو لغة Go . تم ​​الاطلاع عليه في 13 مايو 2014 .
  93. "ويكي Go: Iota - لغة برمجة Go" . go.dev . تم الاطلاع عليه في 15 مايو 2025. يُستخدم مُعرّف iota في لغة Go في تعريفات const لتبسيط تعريفات الأعداد المتزايدة. ولأنه يُمكن استخدامه في التعبيرات، فإنه يُوفر عمومية تتجاوز نطاق التعدادات البسيطة .
  94. "دليل تعليمي للغة البرمجة Go" . لغة البرمجة Go . تم ​​الاطلاع عليه بتاريخ 10 مارس 2013. في لغة Go ، قاعدة رؤية المعلومات بسيطة: إذا كُتب اسم (نوع أو دالة أو طريقة أو ثابت أو متغير من المستوى الأعلى، أو حقل أو طريقة في بنية) بحرف كبير، فسيتمكن مستخدمو الحزمة من رؤيته. وإلا، فإن الاسم، وبالتالي الشيء المسمى، يكون مرئيًا فقط داخل الحزمة التي تم تعريفه فيها.
  95. "go" . لغة البرمجة Go .
  96. "كيفية كتابة كود Go" . لغة برمجة Go . تُعطى الحزم من المكتبة القياسية مسارات استيراد مختصرة مثل "fmt" و"net/http". بالنسبة لحزمك الخاصة، يجب عليك اختيار مسار أساسي من غير المرجح أن يتعارض مع الإضافات المستقبلية للمكتبة القياسية أو المكتبات الخارجية الأخرى. إذا كنت تحتفظ بشفرتك في مستودع مصدر ما، فيجب عليك استخدام جذر مستودع المصدر هذا كمسار أساسي. على سبيل المثال، إذا كان لديك حساب Example على example.com/user، فيجب أن يكون هذا هو مسارك الأساسي.
  97. 1 2 بايك، روب (18 سبتمبر 2012). "التزامن ليس توازياً" .
  98. 1 2 دونوفان، آلان أ.أ.؛ كيرنيغان، برايان و. (2016). لغة البرمجة جو . سلسلة أديسون-ويسلي للحوسبة الاحترافية. نيويورك، ميونيخ: أديسون-ويسلي. ISBN 978-0-13-419044-0.
  99. 1 2 3 4 5 تشيسنال، ديفيد (2012). كتاب عبارات لغة برمجة جو . أديسون-ويسلي. ISBN 9780132919005.
  100. "Effective Go" . لغة برمجة Go .
  101. سمرفيلد، مارك (2012). البرمجة بلغة جو: إنشاء تطبيقات للقرن الحادي والعشرين . أديسون-ويسلي.
  102. "نموذج الذاكرة Go" . تم الاطلاع عليه في 10 أبريل 2017 .
  103. "أنماط التزامن في لغة البرمجة Go" . لغة البرمجة Go .
  104. غراهام-كومينغ، جون (24 أغسطس 2013). "إعادة تدوير مخازن الذاكرة في لغة غو" . مدونة كلاود فلير .
  105. "tree.go" .
  106. تشيسلاك-بوستافا، إيوين. "المكررات في لغة جو" .
  107. كيرنيغان، برايان دبليو. "الهبوط إلى المجهول" .
  108. 1 2 "نموذج الذاكرة المتنقلة" . تم الاطلاع عليه في 5 يناير 2011 .
  109. تانغ، بيي (2010). البرمجة المتوازية متعددة النوى في لغة غو (ملف PDF) . وقائع المؤتمر الدولي الأول للحوسبة والاتصالات المتقدمة. مؤرشف من الأصل (ملف PDF) في 9 سبتمبر 2016. تم الاطلاع عليه في 14 مايو 2015 .
  110. نانز، سيباستيان؛ ويست، سكوت؛ سواريس دا سيلفيرا، كاو. دراسة فجوة الخبرة في البرمجة المتوازية (ملف PDF) . يورو-بار 2013. CiteSeerX 10.1.1.368.6137 . 
  111. المؤلفون. "مشاركة الذاكرة من خلال التواصل" .
  112. كوكس، روس . "انطلاق السباقات" .
  113. بايك، روب (25 أكتوبر 2012). "انطلق إلى جوجل: تصميم اللغة في خدمة هندسة البرمجيات" . جوجل، إنك."هناك تحذير هام واحد: لغة Go ليست آمنة تمامًا من حيث الذاكرة في وجود التزامن."
  114. "تقديم كاشف سباقات جو" . مدونة جو . تم الاطلاع عليه بتاريخ 26 يونيو 2013 .
  115. "ملاحظات إصدار Go 1.6 - لغة برمجة Go" . go.dev . تم الاطلاع عليه بتاريخ 17 نوفمبر 2023 .
  116. "الأسئلة الشائعة (FAQ) - لغة البرمجة Go" .
  117. "قصة نظام ثنائي سمين" . 21 سبتمبر 2018.
  118. "مواصفات لغة برمجة Go، §أنواع الواجهات" . لغة برمجة Go .
  119. "مواصفات لغة برمجة Go، § تأكيدات النوع" . لغة برمجة Go .
  120. "جميع الأنظمة جاهزة للعمل" . informIT (مقابلة). 17 أغسطس 2010. تم الاطلاع عليه في 21 يونيو 2018 .
  121. "أسئلة وأجوبة حول تصميم اللغة" . 13 نوفمبر 2009. مؤرشف من الأصل في 13 نوفمبر 2009.
  122. "اقتراح لآلية شبيهة بالاستثناء" . golang-nuts . 25 مارس 2010. تم الاطلاع عليه في 25 مارس 2010 .
  123. "تاريخ اللقطات الأسبوعية" . لغة البرمجة Go .
  124. "الذعر والتعافي" . اذهب إلى ويكيبيديا.
  125. "Effective Go" . لغة برمجة Go .
  126. "gofmt" . لغة برمجة Go . تم ​​الاطلاع عليه في 5 فبراير 2021 .
  127. "golang/lint public archive" . github.com . November 30, 2022.
  128. 1 2 "Effective Go" . لغة برمجة Go .
  129. "المتغيرات المحلية غير المستخدمة" . yourbasic.org . تم الاطلاع عليه بتاريخ 11 فبراير 2021 .
  130. "استيرادات الحزم غير المستخدمة" . yourbasic.org . تم الاطلاع عليه بتاريخ 11 فبراير 2021 .
  131. "تعليقات مراجعة الكود" . جيت هاب . تم الاطلاع عليه في 3 يوليو 2018 .
  132. "محادثات" . تم الاطلاع عليه في 3 يوليو 2018 .
  133. "الأخطاء هي قيم" . تم الاطلاع عليه في 3 يوليو 2018 .
  134. "tools/gopls/README.md at master · golang/tools" . GitHub . تم الاطلاع عليه بتاريخ 17 نوفمبر 2023 .
  135. "fmt" . لغة البرمجة Go . تم ​​الاطلاع عليه بتاريخ 8 أبريل 2019 .
  136. "الاختبار" . لغة البرمجة Go . تم ​​الاطلاع عليه بتاريخ 27 ديسمبر 2020 .
  137. "حزمة http - net/http - حزم Go" . pkg.go.dev . تم الاطلاع عليه بتاريخ 23 نوفمبر 2024 .
  138. لي، وي-مينغ (24 نوفمبر 2022). "مقدمة إلى لغة برمجة Go" . مجلة مطوري المكونات . مؤرشف من الأصل في 5 يونيو 2023. تم الاطلاع عليه في 8 سبتمبر 2023 .
  139. هوفمان، فرانك؛ نيومير، ماندي (أغسطس 2018). "ببساطة آمن" . مجلة لينكس . العدد 213. مؤرشف من الأصل في 28 مايو 2023. تم الاطلاع عليه في 8 سبتمبر 2023 . 
  140. لي، وي-مينغ (31 أغسطس 2022). "مقدمة في استخدام الحاويات باستخدام دوكر" . مجلة CODE . مؤرشف من الأصل في 30 مايو 2023. تم الاطلاع عليه في 8 سبتمبر 2023 .
  141. بيركر، ألكسندر (24 فبراير 2023). "أمان Kubernetes للمبتدئين" . مجلة CODE . مؤرشف من الأصل في 1 أبريل 2023. تم الاطلاع عليه في 8 سبتمبر 2023 .
  142. تافت، ريبيكا؛ شريف، عرفان؛ ماتي، أندريه؛ فان بنشوتن، ناثان؛ لويس، جوردان؛ جريجر، توبياس؛ نيمي، كاي؛ وودز، آندي؛ بيرزين، آن؛ بوس، رافائيل؛ بارديا، بول؛ رانادي، أمروتا؛ دارنيل، بن؛ جرونير، برام؛ جافري، جاستن؛ تشانغ، لوسي؛ ماتيس، بيتر (11 يونيو 2020). "CockroachDB: قاعدة بيانات SQL مرنة موزعة جغرافيًا". وقائع مؤتمر ACM SIGMOD الدولي لإدارة البيانات لعام 2020. SIGMOD '20 . الصفحات 1493-1509 . doi : 10.1145/3318464.3386134 . ISBN  978-1-4503-6735-6.
  143. هوبكنز، براندون (13 سبتمبر 2022). "إنشاء مواقع ثابتة باستخدام هوغو" . مجلة لينكس . مؤرشف من الأصل في 8 أبريل 2023. تم الاطلاع عليه في 8 سبتمبر 2023 .
  144. سيميوناتو، ميشيل (15 نوفمبر 2009). "الواجهات مقابل الوراثة (أو، احذر من لغة Go!)" . أرتيما . تم الاسترجاع في 15 نوفمبر 2009 .
  145. أستلز، ديف (9 نوفمبر 2009). "جاهزون، استعدوا، انطلقوا!" . إنجينيارد. مؤرشف من الأصل في 19 أكتوبر 2018. تم الاسترجاع في 9 نوفمبر 2009 .
  146. jt (11 يناير 2010). "لغة البرمجة Go من جوجل تفوز بجائزة لغة البرمجة للعام" . jaxenter . تم الاطلاع عليه في 5 ديسمبر 2012 .
  147. "مؤشر مجتمع برمجة TIOBE لشهر يونيو 2015" . شركة TIOBE للبرمجيات. يونيو 2015. تم الاطلاع عليه في 5 يوليو 2015 .
  148. "مؤشر TIOBE" . TIOBE . تم الاطلاع عليه في 15 يوليو 2024 .
  149. إيكل، بروس (27 أغسطس 2011). "استدعاء لغة Go من بايثون عبر JSON-RPC" . تم الاطلاع عليه في 29 أغسطس 2011 .
  150. هوندت، روبرت (2011). التعرف على الحلقات في لغات البرمجة C++/Java/Go/Scala (ملف PDF) . أيام سكالا.
  151. ميتز، كيد (1 يوليو 2011). "جوجل جو ترد بقوة من خلال مسابقة C++" . ذا ريجستر .
  152. ياغر، ويل. "لماذا لا يُعدّ الذهاب جيدًا" . تم الاسترجاع في 4 نوفمبر 2018 .
  153. دوبرونسكي، يانوس. "المتاعب اليومية في لغة جو" . تم الاطلاع عليه بتاريخ 4 نوفمبر 2018 .
  154. "أريد النزول من رحلة السيد غولانغ الجامحة" . 28 فبراير 2020. تم الاطلاع عليه في 17 نوفمبر 2020 .
  155. "اقتراح: os: Create/Open/OpenFile() set FILE_SHARE_DELETE على نظام ويندوز #32088" . جيت هاب . ١٦ مايو ٢٠١٩. تم الاطلاع عليه في ١٧ نوفمبر ٢٠٢٠ .
  156. تو، تينغفي (2019). "فهم أخطاء التزامن في لغة غو في العالم الحقيقي" (ملف PDF) . على سبيل المثال، حوالي 58% من أخطاء الحظر ناتجة عن تمرير الرسائل. بالإضافة إلى انتهاك قواعد استخدام القنوات في لغة غو (مثل الانتظار على قناة لا يرسل إليها أحد بيانات أو إغلاقها)، فإن العديد من أخطاء التزامن ناتجة عن الاستخدام المختلط لتمرير الرسائل مع دلالات ومكتبات جديدة أخرى في لغة غو، وهو ما قد يُغفل عنه بسهولة ولكن يصعب اكتشافه.
  157. براونلي، جون (13 نوفمبر 2009). "لم تبحث جوجل عن كلمة "Go" قبل تسمية لغة البرمجة الخاصة بها"تمت أرشفة هذا النص من المصدر الأصلي في 8 ديسمبر 2015. تم الاطلاع عليه في 26 مايو 2016 .
  158. كلابورن، توماس (11 نوفمبر 2009). "اسم جوجل 'Go' يثير اتهامات بالشر"" . InformationWeek. مؤرشف من الأصل في 22 يوليو 2010. تم الاطلاع عليه في 18 يناير 2010 .
  159. 1 2 "العدد 9 - go — لقد استخدمت هذا الاسم بالفعل للغة البرمجة *الخاصة بي*" . جيت هاب . شركة جوجل . تم الاطلاع عليه في 12 أكتوبر 2010 . 

للمزيد من القراءة