Avatar ·

لماذا نحتاج إلى دالتي make() و new() في Go؟ ما الفرق؟

مرحباً بالجميع! لقد بدأت تعلم Go مؤخراً ولا أستطيع فهم لماذا نحتاج إلى دالتين منفصلتين لتخصيص الذاكرة: make() و new(). يبدو أن كلتيهما تنشئان كائنات، لكن الأمثلة من التوثيق أربكتني فقط.

إليك ما أحاول فعله. أريد إنشاء slice وإضافة عناصر إليه فوراً:

package main

import "fmt"

func main() {
    // أحاول إنشاء slice عبر new
    slice1 := new([]int)
    fmt.Println(slice1)  // يطبع: &[]
    // لكن كيف أضيف عنصراً؟ slice1 = append(slice1, 1) لا يعمل
    // خطأ: first argument to append must be slice; have *[]int

    // أحاول إنشاء slice عبر make
    slice2 := make([]int, 5)
    fmt.Println(slice2) // يطبع: [0 0 0 0 0]
    // يعمل، لكن لماذا الطول 5 فوراً؟ هل يمكن بدون طول؟

    // ونفس القصة مع map
    var m1 map[string]int
    // m1["key"] = 1 // panic: assignment to entry in nil map

    m2 := make(map[string]int)
}