Avatar ·

المؤشرات مقابل القيم: متى تستخدم * و & في المعاملات والقيم المُرجعة في Go؟

لقد بدأت للتو في تعلم Go وأظل مرتبكًا بشأن متى أمرر مؤشرًا ومتى أمرر قيمة. يبدو أنني قرأت الكثير من المقالات، ولكن في الممارسة العملية ما زلت أفعل ذلك بشكل خاطئ. على سبيل المثال، لدي هيكل User ودالة تقوم بتحديثه: ```go type User struct { Name string Age int Score float64 } func UpdateScore(u User, newScore float64) { u.Score = newScore } ``` عندما أستدعي `UpdateScore(myUser, 95.5)`، يبقى `myUser.Score` كما هو بعد الاستدعاء. أدركت أن هذا لأن Go تنسخ الهيكل. ثم قمت بالتغيير إلى `*User`: ```go func UpdateScore(u *User, newScore float64) { u.Score = newScore } ``` الآن يعمل. ولكن عندما أكتب دالة تُرجع مستخدمًا جديدًا، أرى خيارين: ```go func NewUser(name string, age int) User { ... } func NewUserPtr(name string, age int) *User { ... } ``` أيهما صحيح؟ وأيضًا: ماذا عن الهياكل الكبيرة؟ هل أكتب مؤشرات في كل مكان؟ وماذا عن الأنواع الأساسي