الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 1 من 516/50 في الدورة~8 min
دروس الوحدة (1/5)

صفائف ذات طول ثابت

في Go، مصفوفة لها طول ثابت، مضمنة في نوعها: [N]T. إنها بدائية نادرًا ما تُستخدم مباشرة في كود التطبيق — سوف تفعل ذلك تعمل دائمًا تقريبًا مع الشرائح (الدرس التالي)، والتي تكون ديناميكية وجهات النظر على المصفوفات.

ومع ذلك، فإن فهم المصفوفات بشكل جيد أمر ضروري: فكل شيء في Go مبني على رأسهم.

الإعلان والتهيئة

Go
var a [3]int = [3]int{10, 20, 30}
b := [3]int{1, 2, 3}            // inference with :=
c := [3]int{}                   // all zero: [0, 0, 0]
d := [...]int{1, 2, 3, 4}       // length inferred = 4

القيمة الصفرية للمصفوفة هي مصفوفة بالطول المعلن مع كل منها العنصر عند قيمته صفر:

Go
var nums [5]int  // [0 0 0 0 0]

الفهرسة و len

Go
a := [3]int{10, 20, 30}
fmt.Println(a[0])      // 10
a[1] = 99
fmt.Println(len(a))    // 3

يؤدي الوصول خارج النطاق إلى حدوث ذعر في وقت التشغيل (وليس حالة غير محددة صامتة كما في ج).

الطول جزء من النوع

Go
var a [3]int
var b [4]int
// a = b   // ERROR: different types

[3]int و[4]int هما نوعان متميزان، على الرغم من أن كلاهما يحملان محمي_INLINE_5. ولهذا السبب نادرًا ما يتم تمرير المصفوفات إلى الوظائف: يجب عليك القيام بذلك رمز الثابت الطول في نوع المعلمة.

نسخ حسب القيمة

على عكس الشرائح (المرجع) والخرائط (المرجع)، يتم **نسخ المصفوفات بواسطة القيمة **:

Go
a := [3]int{1, 2, 3}
b := a               // copy
b[0] = 99
fmt.Println(a[0])    // 1 — a is unchanged

وينطبق الشيء نفسه عند التمرير إلى دالة: تستقبل الدالة ملفها نسخة خاصة.

متى تستخدم المصفوفات؟

  • المخازن المؤقتة ذات الحجم الثابت المعروفة في وقت الترجمة (على سبيل المثال [16]byte لـ MD5).
  • مفاتيح الخريطة المركبة (الشرائح ليست "قابلة للمقارنة"، والمصفوفات كذلك).
  • الأداء الفائق (بدون مواربة، وذاكرة التخزين المؤقت ودية).

بالنسبة إلى 99% من الكود: استخدم الشرائح.

جربه

تمرين#go.m4.l1.e1
المحاولات: 0جارٍ التحميل…

قم بتعريف a كصفيف من 3 ints بالقيم 10، 20، 30 وطباعة طوله.

جارٍ تحميل المحرر…
إظهار التلميح

المصفوفة الحرفية: `[3]int{a, b, c}`.

الحل متاح بعد 3 من المحاولات

تمرين#go.m4.l1.e2
المحاولات: 0جارٍ التحميل…

قم بتعريف b كمصفوفة مكونة من 5 ints (جميعها صفر) وقم بتعيين 99 للموضع 2.

جارٍ تحميل المحرر…
إظهار التلميح

`var b [5]int` يبدأ بـ [0 0 0 0 0].

الحل متاح بعد 3 من المحاولات

Quiz#go.m4.l1.e3
جاهز

هل [3]int و[4]int من نفس النوع؟

Go
var a [3]int
var b [4]int
// a = b ?
خيارات الإجابة

خلاصة

  • [N]T: الطول الثابت، جزء من النوع.
  • القيمة الصفرية: كل عنصر عند قيمته الصفرية.
  • [...]int{...} يتيح للمترجم استنتاج الطول.
  • نسخ حسب القيمة (بما في ذلك الوظائف الداخلية).
  • خارج النطاق = الذعر، وليس غير محدد.
  • عمليًا، استخدم الشرائح، وهي طرق عرض على المصفوفات.