"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تقوم الدالة `reflect.MakeSlice` بإرجاع قيمة غير قابلة للعنونة؟

لماذا تقوم الدالة `reflect.MakeSlice` بإرجاع قيمة غير قابلة للعنونة؟

تم النشر بتاريخ 2024-11-10
تصفح:797

Why is the `reflect.MakeSlice` Function Returning an Un-Addressable Value?

لماذا Reflect.MakeSlice تُرجع قيمة غير قابلة للعنونة

في Go، توفر حزمة الانعكاس واجهة لفحص الأنواع والقيم ومعالجتها. Reflect.MakeSlice ينشئ شريحة من نوع معين. ومع ذلك، القيمة التي تم إرجاعها غير قابلة للعنونة. هذا يعني أنه لا يمكنك أخذ عنوانها أو تعيينها لمؤشر.

الحل: استخدام Reflect.New()

للحصول على شريحة قابلة للعنونة باستخدام الانعكاس، عليك يمكن استخدام الدالة Reflect.New() لإنشاء مؤشر للشريحة. يمكن القيام بذلك على النحو التالي:

// Create the slice type
sliceType := reflect.SliceOf(SomeType)

// Create a slice using reflect.MakeSlice
slice := reflect.MakeSlice(sliceType, 10, 10)

// Create a pointer to the slice
slicePtr := reflect.New(slice.Type())

// Set the slice pointer to the slice
slicePtr.Elem().Set(slice)

الآن، لديك شريحة قابلة للعنونة يمكن تمريرها كوسيطة إلى الوظائف التي تتطلب مؤشر شريحة.

لماذا تعكس. تقوم MakeSlice بإرجاع قيمة غير قابلة للعنونة

متغيرات المكدس المحلية في Go غير قابلة للعنونة لأن وقت التشغيل قد ينقلها إلى الكومة في أي وقت. Reflect.MakeSlice ينشئ متغير شريحة محلي، وهذا هو السبب في أن القيمة التي يتم إرجاعها غير قابلة للعنونة.

لماذا يلزم وجود مؤشر إلى شريحة

بعض واجهات برمجة التطبيقات، مثل كما ذكرت من الحزمة mgo، تتطلب مؤشرًا لشريحة كوسيطة. وذلك لأنه عند إلحاق الشريحة، قد يتم تخصيص شريحة جديدة ذات سعة متزايدة. إذا قمت بتمرير شريحة غير مؤشرة، فإن التغييرات التي تم إجراؤها على الشريحة لن تكون مرئية خارج الوظيفة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3