لماذا تحتاج دوال make() و new() في Go وما الفرق بينهما؟
مرحبًا بالجميع! لقد بدأت للتو في تعلم Go وأصبحت مرتبكًا بين دالتين مدمجتين — make() و new(). في التوثيق مكتوب أن كلتيهما تخصصان ذاكرة، لكنني لا أفهم متى أستخدم أيًا منهما.
إليك مثال بسيط يربكني. أريد إنشاء map و slice:
// الخيار 1: باستخدام new()
m := new(map[string]int)
s := new([]int)
// الخيار 2: باستخدام make()
m2 := make(map[string]int)
s2 := make([]int, 5)
الخيار الأول يتم ترجمته، ولكن عند محاولة إضافة قيمة إلى الخريطة عبر m["key"] = 1 أحصل على panic: assignment to entry in nil map. مع slice أيضًا مشكلة — s[0] = 10 يتسبب في nil pointer. بينما الخيار الثاني يعمل بشكل ممتاز.
ما السحر هنا؟ لماذا لا تعمل new() مع map و slice؟ قرأت أن new() تُرجع مؤشرًا، بينما make() لا تُرجع، لكن هذا لا يشرح لماذا يعمل أحدهما والآخر لا. اشرحوا لي، من فضلكم، للمبتدئ