لماذا 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