Avatar ·

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

مرحباً بالجميع! بدأت تعلم Go مؤخراً، ويُقلقني باستمرار سؤال: متى يجب تمرير المعاملات إلى دالة كمؤشر، ومتى كقيمة؟ ونفس الشيء مع القيم المُرجعة. يبدو أنني أفهم أن المؤشرات تسمح بتجنب نسخ البيانات، لكن في Go كل شيء يُنسخ أم لا؟ لقد كتبت مثالاً صغيراً حيث أنشئ هيكل User وأحاول تعديله: ```go type User struct { Name string Age int } func updateUser(u User) { u.Name = "New Name" // لا يعمل كما هو متوقع } func updateUserPtr(u *User) { u.Name = "New Name" // يعمل } ``` لكن ما يربكني هو: يبدو أن كل شيء في Go يُمرر بالقيمة، لكن slices و maps تتصرف كمراجع؟ أم لا؟ قرأت أن الهياكل الكبيرة من الأفضل تمريرها كمؤشر لتجنب النسخ، والصغيرة بالقيمة. لكن ما الذي يُعتبر "كبيراً"؟ 10 حقول؟ 20؟ أم أن الأمر لا يتعلق بالحجم فقط؟ أيضاً، لا أفهم متى يجب إرجاع مؤشر من دالة، ومتى يجب إرجاع قيمة.