استكشاف الانعكاس باستخدام SetString للهياكل
يوفر الانعكاس أدوات قوية لمعالجة هياكل Go ديناميكيًا. في هذا المثال، نواجه مشكلة شائعة عند محاولة تعيين قيمة حقل البنية باستخدام الانعكاس: تقوم CanSet() دائمًا بإرجاع خطأ. يمنع هذا العائق إجراء تعديلات على الحقول، مما يتركنا في مأزق.
تحديد المزالق
يسلط مقتطف الكود المقدم الضوء على خطأين أساسيين:
حل المشكلات
بعد معالجة هذه المخاطر، يمكننا تحسين الكود الخاص بنا:func SetField(source interface{}, fieldName string, fieldValue string) {
v := reflect.ValueOf(source).Elem() // Obtain the value of the pointed object
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
في وظيفة SetField() المعدلة، نقوم بما يلي:أدخل الكود الإجراء
بفضل هذه التعديلات، ينجح الكود الآن في تحديث قيمة Field1:func main() {
source := ProductionInfo{}
source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2})
fmt.Println("Before: ", source.StructA[0])
SetField(&source.StructA[0], "Field1", "NEW_VALUE")
fmt.Println("After: ", source.StructA[0])
}
الإخراج:قبل: {A 2}
حقيقي
بعد: {NEW_VALUE 2}Before: {A 2} true After: {NEW_VALUE 2}تعرض النتيجة التعديل الناجح للحقل 1 داخل بنية الإدخال.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3