تخصيص الهياكل في المكدس والكومة في Go: كيف يرتبط ذلك بجمع القمامة؟
مرحبًا بالجميع! لقد بدأت للتو في تعلم Go بعد C++ وJava، وأنا مرتبك جدًا بشأن مسألة تخصيص الذاكرة للهياكل. في C++، كنت معتادًا على التحكم صراحةً في ما إذا كنت أنشئ كائنًا على المكدس (`MyClass obj;`) أو في الكومة (`MyClass* obj = new MyClass();`). في Java، كل شيء دائمًا في الكومة، والمراجع على المكدس.
لكن في Go، أرى أنه يمكن إنشاء الهياكل كـ `myStruct := MyStruct{}` (يبدو أنها على المكدس) وكـ `myStruct := &MyStruct{}` (يبدو أنها في الكومة). ومع ذلك، يوجد في Go جامع قمامة. أنا مرتبك تمامًا.
على سبيل المثال، لدي هذا الكود:
```go
type User struct {
Name string
Age int
}
func createUser(name string, age int) *User {
u := User{Name: name, Age: age}
return &u // أعيد مؤشرًا إلى متغير محلي!
}
```
في C++، سيكون هذا سلوكًا غير محدد (مؤشر معلق). لكن في Go، هذا يعمل. هل يعني هذا أن `u` يتم تخصيصها دائمًا في الكومة؟ أم أن المترجم ذكي ويقرر بنفسه؟ كيف يرتبط هذا بجمع القمامة؟ لماذا يقول البعض أحيانًا أنه في Go من الأفضل