Avatar ·

تخصيص الهياكل في المكدس والكومة في 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 من الأفضل