الفهرس:
- الأنواع التي قد تحتوي قيمها على أجزاء كامنة غير مباشرة.
- الأنواع التي يمكن استخدام قيمها كمعطيات للدالة المدمجة
len(والدوالcapوcloseوdeleteوmake). - مقارنة أنواع الحاويات المدمجة.
- الأنواع التي يمكن تمثيل قيمها بالقيم الحرفية المركّبة (
T{...}). - أحجام قيم جميع أصناف الأنواع.
- الأنواع التي يمكن تمثيل قيمها الصفرية بـ
nil. - الأنواع التي يمكننا تنفيذ طرائق لها.
- الأنواع التي يمكن تضمينها في أنواع البنى.
- الدوال التي ستُقيَّم استدعاءاتها أو قد تُقيَّم في وقت التصريف.
- القيم التي لا يمكن أخذ عناوينها.
- الأنواع التي لا تدعم المقارنات.
- عناصر الشيفرة التي يُسمح بتعريفها دون استخدامها.
- عناصر الشيفرة المصدرية المسمّاة التي يمكن تعريفها معاً داخل
(). - عناصر الشيفرة المصدرية المسمّاة التي يمكن تعريفها داخل الدوال وخارج أي دالة.
- التعبيرات التي قد تحتوي نتائج تقييمها على قيم إضافية اختيارية.
- طرق حجب الـgoroutine الحالية إلى الأبد باستخدام آلية القنوات.
- طرق دمج النصوص.
- التحسينات التي يُجريها مصرِّف Go القياسي.
- حالات panic والانهيار في وقت التشغيل.
الأنواع التي قد تحتوي قيمها على أجزاء كامنة غير مباشرة
الأنواع التي قد تحتوي قيمها على أجزاء كامنة غير مباشرة:
- أنواع النصوص
- أنواع الدوال
- أنواع الشرائح
- أنواع الخرائط
- أنواع القنوات
- أنواع الواجهات
تستند هذه الإجابة إلى تنفيذ المصرِّف/وقت التشغيل القياسي لـ Go. في الواقع، يصعب إثبات ما إذا كانت قيم الدوال قد تحتوي على أجزاء كامنة غير مباشرة أم لا، وينبغي النظر إلى قيم النصوص وقيم الواجهات منطقياً على أنها قيم بلا أجزاء كامنة غير مباشرة. يرجى قراءة أجزاء القيمة للتفاصيل.
الأنواع التي يمكن استخدام قيمها كمعطيات للدالة المدمجة len (والدوال cap وclose وdelete وmake)
| len | cap | close | delete | make | |
|---|---|---|---|---|---|
| string | نعم | ||||
| array | |||||
| (ومؤشر المصفوفة) | نعم | نعم | |||
| slice | نعم | نعم | نعم | ||
| map | نعم | نعم | نعم | ||
| channel | نعم | نعم | نعم | نعم |
يمكن أيضاً التنقل بقيم الأنواع المذكورة أعلاه في حلقات for-range.
يمكن تسمية الأنواع التي يمكن استخدام قيمها كمعطيات للدالة المدمجة len أنواع حاويات بالمعنى الواسع.
مقارنة أنواع الحاويات المدمجة
| النوع | هل يمكن إضافة عناصر جديدة إلى القيم؟ | هل عناصر القيم قابلة للاستبدال؟ | هل عناصر القيم قابلة للعنونة؟ | هل ستعدّل عمليات الوصول إلى العناصر أطوال القيم؟ | هل قد تحتوي القيم على أجزاء كامنة |
|---|---|---|---|---|---|
| string | لا | لا | لا | لا | نعم(1) |
| array | لا | نعم(2) | نعم(2) | لا | لا |
| slice | لا(3) | نعم | نعم | لا | نعم |
| map | نعم | نعم | لا | لا | نعم |
| channel | نعم(4) | لا | لا | نعم | نعم |
(1) بالنسبة إلى المصرِّف/وقت التشغيل القياسي لـ Go.
(2) لقيم المصفوفات القابلة للعنونة فقط.
(3) عموماً، تُعدَّل قيمة الشريحة بإسناد قيمة شريحة أخرى إليها بالكتابة فوقها. وهنا لا يُنظر إلى مثل هذه الحالات على أنها «إضافة عناصر جديدة». في الواقع، يمكن أيضاً تعديل أطوال الشرائح بشكل منفصل عبر استدعاء الدالة reflect.SetLen. وزيادة طول شريحة بهذه الطريقة نوع من إضافة عناصر جديدة إلى الشريحة. لكن الدالة reflect.SetLen بطيئة، لذا نادراً ما تُستخدم.
(4) بالنسبة إلى القنوات المخزّنة التي لا تزال غير ممتلئة.
الأنواع التي يمكن تمثيل قيمها بالقيم الحرفية المركّبة (T{...})
يمكن تمثيل قيم الأنواع الأربعة التالية بالقيم الحرفية المركّبة:
النوع (T) |
هل T{} قيمة صفرية للنوع T؟ |
|---|---|
| struct | نعم |
| array | نعم |
| slice | لا |
(القيمة الصفرية هي nil) |
|
| map | لا |
(القيمة الصفرية هي nil) |
أحجام قيم جميع أصناف الأنواع
يرجى قراءة تكاليف نسخ القيم للتفاصيل.
الأنواع التي يمكن تمثيل قيمها الصفرية بـ nil
يمكن تمثيل القيم الصفرية للأنواع التالية بـ nil.
النوع (T) |
حجم T(nil) |
|---|---|
| pointer | كلمة واحدة |
| slice | 3 كلمات |
| map | كلمة واحدة |
| channel | كلمة واحدة |
| function | كلمة واحدة |
| interface | كلمتان |
الأحجام المذكورة أعلاه خاصة بالمصرِّف القياسي لـ Go. وتعني الكلمة الواحدة (word) 4 بايتات على معماريات 32 بت و8 بايتات على معماريات 64 بت. كما أن الأجزاء الكامنة غير المباشرة لقيمة ما لا تساهم في حجم القيمة.
حجم القيمة الصفرية لنوع ما هو نفسه حجم أي قيم أخرى من النوع نفسه.
الأنواع التي يمكننا تنفيذ طرائق لها
يرجى قراءة الطرق في Go للتفاصيل.
الأنواع التي يمكن تضمينها في أنواع البنى
يرجى قراءة ما الأنواع التي يمكن تضمينها للتفاصيل.
الدوال التي ستُقيَّم أو قد تُقيَّم استدعاءاتها في وقت التصريف
إذا قُيِّم استدعاء دالة في وقت التصريف، وجب أن تكون نتائج إرجاعه ثوابت.
| الدالة | نوع الإرجاع | هل تُقيَّم الاستدعاءات دائماً في وقت التصريف؟ |
|---|---|---|
| unsafe.Sizeof | uintptr |
نعم، دائماً. لكن يرجى ملاحظة أن نتيجة استدعاء كهذا لا تُعتبر ثابتاً إذا كان نوع معطى الاستدعاء وسيط نوع (type parameter). |
| unsafe.Alignof | ||
| unsafe.Offsetof | ||
| len | int |
ليس دائماً. من مواصفة Go: يكون التعبير len(s) ثابتاً إذا كان s ثابتاً نصياً. يكون التعبيران len(s) وcap(s) ثابتين إذا كان نوع s مصفوفة أو مؤشراً إلى مصفوفة ولا يحتوي التعبير s على عمليات استقبال من قنوات أو استدعاءات دوال (غير ثابتة). يرجى ملاحظة أنه حتى لو قُيِّم استدعاء دالة كهذا في وقت التصريف، فلا تُعتبر نتيجة التقييم ثابتاً إذا كان نوع معطى الاستدعاء وسيط نوع. |
| cap | ||
| real | النتيجة قيمة غير منمَّطة. ونوعها الافتراضي هو float64. |
ليس دائماً. من مواصفة Go: يكون التعبيران real(s) وimag(s) ثابتين إذا كان s ثابتاً مركّباً. |
| imag | ||
| complex | النتيجة قيمة غير منمَّطة. ونوعها الافتراضي هو complex128. |
ليس دائماً. من مواصفة Go: يكون التعبير complex(sr, si) ثابتاً إذا كان كل من sr وsi ثابتاً عددياً. |
القيم القابلة للعنونة وغير القابلة للعنونة
يرجى قراءة بند الأسئلة الشائعة هذا لمعرفة القيم القابلة للعنونة (addressable) وغير القابلة للعنونة.
الأنواع التي لا تدعم المقارنات
يرجى قراءة بند الأسئلة الشائعة هذا لمعرفة القيم القابلة للعنونة وغير القابلة للعنونة.
عناصر الشيفرة التي يُسمح بتعريفها دون استخدامها
| | هل يُسمح بتعريفه دون استخدامه؟ | | --- | | import | لا | | type | نعم | | variable | نعم بالنسبة إلى المتغيرات على مستوى الحزمة. لا بالنسبة إلى المتغيرات المحلية (بالنسبة إلى المصرِّف القياسي). | | constant | نعم | | function | نعم | | label | لا |
عناصر الشيفرة المصدرية المسمّاة التي يمكن تعريفها معاً داخل ()
يمكن تعريف عناصر الشيفرة المصدرية التالية (من الصنف نفسه) معاً داخل ():
- import
- type
- variable
- constant
لا يمكن تعريف الدوال معاً داخل (). وكذلك التسميات (labels).
عناصر الشيفرة المصدرية المسمّاة التي يمكن تعريفها داخل الدوال وخارج أي دالة
يمكن تعريف عناصر الشيفرة المصدرية المسمّاة التالية داخل الدوال وخارج أي دالة:
- type
- variable
- constant
يجب تعريف عمليات الاستيراد قبل تعريفات العناصر الأخرى (وبعد جملة الحزمة). ولا يمكن تعريف الدوال إلا خارج أي دالة. ويمكن تعريف الدوال المجهولة داخل أجسام دوال أخرى، لكن مثل هذه التعريفات ليست تعريفات دوال. ويجب تعريف التسميات داخل الدوال.
التعبيرات التي قد تحتوي نتائج تقييمها على قيم إضافية اختيارية
قد تحتوي نتائج تقييم التعبيرات التالية على قيم إضافية اختيارية:
| الصياغة | معنى القيمة الاختيارية (ok في أمثلة الصياغة) |
هل سيؤثر حذف النتيجة الاختيارية على سلوك البرنامج؟ | |
|---|---|---|---|
| الوصول إلى عنصر خريطة | e, ok = aMap[key] |
ما إذا كان المفتاح المُتوصَّل إليه موجوداً في الخريطة أم لا | لا |
| استقبال قيمة من قناة | e, ok = <- aChannel |
ما إذا كانت القيمة المستقلَبة قد أُرسلت قبل إغلاق القناة أم لا | لا |
| تأكيد النوع | v, ok = anInterface.(T) |
ما إذا كان النوع الديناميكي لقيمة الواجهة يطابق النوع المؤكَّد أم لا | نعم |
| (عند حذف النتيجة المنطقية الاختيارية، يحدث panic إذا فشل التأكيد.) |
طرق حجب الـgoroutine الحالية إلى الأبد باستخدام آلية القنوات
دون استيراد أي حزمة، يمكننا استخدام الطرق التالية لجعل الـgoroutine الحالية تدخل (وتبقى) في حالة الحجب إلى الأبد:
- إرسال قيمة إلى قناة لن يستقبل أحد قيماً منها ```go
make(chan struct{}) <- struct{}{} // أو make(chan<- struct{}) <- struct{}{}
2. استقبال قيمة من قناة لن تُغلق أبداً ولم تُرسل إليها أي قيم ولن تُرسل ```go
<-make(chan struct{})
// أو
<-make(<-chan struct{})
// أو
for range make(<-chan struct{}) {}
- استقبال قيمة من قناة nil (أو إرسال قيمة إليها) ```go
chan struct{}(nil) <- struct{}{} // أو <-chan struct{}(nil) // أو for range chan struct{}(nil) {}
4. استخدام كتلة select مجرّدة ```go
select{}
طرق دمج النصوص
يرجى قراءة النصوص في Go للتفاصيل.
التحسينات التي يُجريها مصرِّف Go القياسي
يرجى قراءة كتاب Go Optimizations 101.
حالات panic والانهيار في وقت التشغيل
يرجى قراءة مقالة ويكي Go 101 لهذا الملخص.
مهام: أنواع كتل تدفّق التحكم، جملات تدفّق التحكم return، break، fallthrough، continue، goto، جملات تدفّق التحكم التي يمكن أن تتبعها تسمية. جملات تدفّق التحكم التي يمكن أن تظهر في أي كتل تدفّق تحكم