0Pricing
Go Academy · درس

الشرائح: قوائم ديناميكية

‏make وappend وcopy وlen وcap

الشرائح: قوائم ديناميكية درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

ما الشريحة؟

الشريحة هي عرض ديناميكي الحجم لمصفوفة أساسية. وتتكوّن من ثلاثة عناصر: مؤشر إلى المصفوفة، وطول، وسعة.

  • الشرائح أنواع مرجعية، لذا يمكن لعدة شرائح مشاركة المصفوفة الداعمة نفسها
  • تستخدم معظم الأعمال الشبيهة بالقوائم في Go الشرائح لا المصفوفات

حرفيات الشرائح و make

أنشئوا الشرائح باستخدام حرفية أو make:

package main
import "fmt"

func main() {
    nums := []int{1, 2, 3, 4, 5}      // literal
    strs := make([]string, 3)          // len=3, cap=3, zero values
    buf  := make([]byte, 0, 64)        // len=0, cap=64
    fmt.Println(nums, strs, len(buf), cap(buf))
}

len و cap

تُرجع len عدد العناصر الموجودة حاليًا في الشريحة. وتُرجع cap سعة المصفوفة الأساسية بدءًا من مؤشر بداية الشريحة.

package main
import "fmt"

func main() {
    s := make([]int, 3, 8)
    fmt.Println(len(s)) // 3
    fmt.Println(cap(s)) // 8
}

append: توسيع شريحة

تضيف append عناصر إلى شريحة، وتخصّص مصفوفة أساسية جديدة عند تجاوز السعة:

package main
import "fmt"

func main() {
    s := []int{1, 2, 3}
    s = append(s, 4, 5)
    s = append(s, []int{6, 7, 8}...)
    fmt.Println(s) // [1 2 3 4 5 6 7 8]
}

اقتطاع شريحة

استخدموا الصيغة [low:high] لإنشاء شريحة فرعية (تشارك المصفوفة الأساسية):

package main
import "fmt"

func main() {
    a := []int{0, 1, 2, 3, 4, 5}
    b := a[1:4]   // [1 2 3]
    c := a[:3]    // [0 1 2]
    d := a[3:]    // [3 4 5]
    fmt.Println(b, c, d)
}

copy: شرائح مستقلة

تنسخ copy العناصر بين الشرائح وتُرجع عدد العناصر المنسوخة. ولا تشترك الوجهة والمصدر في الذاكرة:

package main
import "fmt"

func main() {
    src := []int{1, 2, 3}
    dst := make([]int, len(src))
    n := copy(dst, src)
    dst[0] = 99
    fmt.Println(src, dst, n) // [1 2 3] [99 2 3] 3
}

الشريحة nil مقابل الشريحة الفارغة

لا تملك الشريحة nil مصفوفة أساسية. أما الشريحة الفارغة فلها مصفوفة أساسية، لكن طولها 0. وكلتاهما لهما len == 0:

package main
import "fmt"

func main() {
    var nilSlice []int
    emptySlice  := []int{}
    fmt.Println(nilSlice  == nil) // true
    fmt.Println(emptySlice == nil) // false
    fmt.Println(len(nilSlice), len(emptySlice)) // 0 0
    nilSlice = append(nilSlice, 1) // safe!
}

حذف عنصر

لا توفر Go دالة حذف مضمّنة للشرائح. ويستخدم الأسلوب الاصطلاحي الدالة append:

package main
import "fmt"

func main() {
    s := []int{1, 2, 3, 4, 5}
    i := 2 // delete index 2
    s = append(s[:i], s[i+1:]...)
    fmt.Println(s) // [1 2 4 5]
}

إدراج عنصر

أدرجوا عنصرًا في الموضع i بدمج append مع الاقتطاع:

package main
import "fmt"

func main() {
    s := []int{1, 2, 4, 5}
    i := 2
    s = append(s[:i+1], s[i:]...)
    s[i] = 3
    fmt.Println(s) // [1 2 3 4 5]
}

مشكلة الشرائح: المصفوفة الأساسية المشتركة

تشارك الشرائح الفرعية المصفوفة الأساسية، لذا يؤثر تعديل إحداها في الأخرى إلى أن تحدث إعادة تخصيص:

package main
import "fmt"

func main() {
    a := []int{1, 2, 3, 4}
    b := a[:2]   // shares backing array
    b[0] = 99
    fmt.Println(a) // [99 2 3 4] — a is changed!
}

تحقّق سريع

ماذا تُرجع append؟

مراجعة: الشرائح

أهم النقاط:

  • الشرائح = مؤشر + len + cap، وهي تغلّف المصفوفات
  • استخدموا make لتخصيص السعة مسبقًا
  • أسندوا دائمًا نتيجة append
  • تنشئ copy شرائح مستقلة
  • انتبهوا إلى المصفوفات الأساسية المشتركة مع الشرائح الفرعية

مهمة تدريبية

أنشئوا شريحة من 5 أعداد صحيحة باستخدام make، وأضيفوا إليها ثلاث قيم أخرى، ثم انسخوها إلى شريحة جديدة وعدّلوا النسخة من دون التأثير في الأصل. اطبعوا الشريحتين.

الأسئلة الشائعة

هل درس «الشرائح: قوائم ديناميكية» مجاني؟

نعم — نص درس «الشرائح: قوائم ديناميكية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «الشرائح: قوائم ديناميكية»؟

‏make وappend وcopy وlen وcap تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «الشرائح: قوائم ديناميكية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

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

جميع الدروس في هذه الدورة

  1. المصفوفات: مجموعات ثابتة الطول
  2. الشرائح: قوائم ديناميكية
  3. الخرائط: مخازن المفتاح والقيمة
  4. التكرار على المجموعات باستخدام range
← العودة إلى Go Academy