"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > فيما يلي بعض خيارات العنوان، مع الأخذ في الاعتبار الحاجة إلى تنسيق السؤال: * **لماذا يقوم `json.Unmarshal` بإرجاع خريطة بدلاً من هيكل في Go؟** (بسيط ومباشر) * **جولانج: Unmarshaling int

فيما يلي بعض خيارات العنوان، مع الأخذ في الاعتبار الحاجة إلى تنسيق السؤال: * **لماذا يقوم `json.Unmarshal` بإرجاع خريطة بدلاً من هيكل في Go؟** (بسيط ومباشر) * **جولانج: Unmarshaling int

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

Here are a few title options, keeping in mind the need for a question format:

* **Why Does `json.Unmarshal` Return a Map Instead of a  Struct in Go?** (Simple and direct)
* **Golang: Unmarshaling into an Interface - Why is My Struct a Map?** (More specif

لماذا يقوم json.Unmarshal بإرجاع خريطة بدلاً من البنية المتوقعة؟

في مثال الملعب هذا، يقوم json.Unmarshal بإرجاع خريطة بدلاً من البنية المتوقعة: http //play.golang.org/p/dWku6SPqj5.

تنشأ المشكلة بسبب تمرير معلمة واجهة {} إلى json.Unmarshal، وتحاول المكتبة إلغاء تنظيمها في مصفوفة بايت. ومع ذلك، لا تحتوي المكتبة على مرجع مباشر للبنية المقابلة، على الرغم من أنها تحتوي على انعكاس.اكتب المرجع.

تكمن المشكلة في الكود التالي:

var ping interface{} = Ping{}
deserialize([]byte(`{"id":42}`), &ping)
fmt.Println("DONE:", ping) // It's a simple map now, not a Ping. Why?
لحل هذه المشكلة، قم إما بتمرير مؤشر إلى بنية Ping بشكل صريح كواجهة مجردة:

var ping interface{} = &Ping{}
deserialize([]byte(`{"id":42}`), ping)
fmt.Println("DONE:", ping)
بدلاً من ذلك، إذا كان المؤشر المباشر غير متوفر، قم بإنشاء مؤشر جديد باستخدام الانعكاس، وإلغاء التسلسل فيه، ثم انسخ القيمة مرة أخرى:

واجهة var ping{} = Ping{}
nptr := Reflect.New(reflect.TypeOf(ping))
إلغاء التسلسل ([] بايت (`{"id":42}`)، nptr.Interface())
بينغ = nptr.Interface()
fmt.Println("تم:"، بينغ)
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3