في Go، يتم تمرير الوسائط إلى الوظائف حسب القيمة، مما يعني أن أي تغييرات يتم إجراؤها على الوسيطة داخل الدالة لا تنعكس في المتغير الأصلي. يمكن أن يصبح هذا مشكلة عند العمل مع أنواع البيانات القابلة للتغيير مثل الشرائح، حيث أن إلحاق الشريحة داخل الوظيفة لن يؤثر على الشريحة الأصلية خارج نطاق الوظيفة.
خذ بعين الاعتبار المثال التالي:
nums := []int{1, 2, 3} func addToNumbs(nums []int) []int { nums = append(nums, 4) fmt.Println(nums) // []int{1, 2, 3, 4} } fmt.Println(nums) // []int{1, 2, 3}
في هذا المثال، تأخذ الدالة AddToNumbs نسخة من شريحة الأرقام وتضيف القيمة 4. يؤدي هذا إلى تعديل النسخة الموجودة بداخلها فقط الدالة، وتبقى شريحة الأرقام الأصلية دون تغيير خارج الدالة.
لحل هذه المشكلة، تحتاج إلى تمرير الشريحة حسب المرجع. إحدى الطرق للقيام بذلك هي تمرير مؤشر إلى الشريحة:
func myAppend(list *[]string, value string) { *list = append(*list, value) }
بتمرير مؤشر إلى الشريحة، فإن أي تغييرات يتم إجراؤها داخل الوظيفة تنعكس مباشرة في الشريحة الأصلية. ومع ذلك، فإن تمرير المؤشر يعني أيضًا أن الوظيفة يمكنها تعديل الشريحة بطرق قد لا تتوقعها، لذلك من المهم استخدام المؤشرات بعناية.
البديل الآخر هو إرجاع الشريحة المعدلة من الوظيفة، كما هو موضح في المثال التالي:
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage { // Append to the accumulator and return it directly messages = append(messages, message) return messages }
في هذه الحالة، تقوم وظيفة التحقق بإرجاع شريحة الرسائل المعدلة، مما يلغي الحاجة إلى تمرير مؤشر إلى الشريحة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3