لماذا نحتاج إلى دالتي 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)
}