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

كيفية تحويل بنية في Go: التضمين أو النسخ اليدوي أو التحويل الصريح؟

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

How to Convert a Struct in Go: Embedding, Manual Copying, or Explicit Conversion?

تحويل البنية في Go

ضع في اعتبارك البنيتين التاليتين:

اكتب البنية { كثافة العمليات ب سلسلة } هيكل النوع ب { أ سلسلة ج
type A struct {
    a int
    b string
}

type B struct {
    A
    c string
}
لنفترض أن لديك متغيرًا من النوع A وتريد تحويله إلى النوع B. هل هذا ممكن في Go، أم أنك بحاجة إلى نسخ الحقول يدويًا أو إنشاء طريقة تحويل صريحة؟

الطريقة الأولى: تعيين البنية المضمنة

كما ذكرت في سؤالك، يمكن استخدام التضمين لهذا الغرض. من خلال تضمين A في B، يمكنك تحويل متغير من النوع A إلى النوع B ببساطة عن طريق تعيينه إلى الحقل المضمن. على سبيل المثال:

func main() { البنية A := أ {أ: 42، ب: "فو"} structB := B{A: structA} // تضمين structA في structB
func main() {
    structA := A{a: 42, b: "foo"}
    structB := B{A: structA} // Embed structA into structB
}
ينشئ هذا الأسلوب مثيلًا جديدًا لـ B الذي يحتوي على البيانات من A في الحقل المضمن الخاص به.

الطريقة الثانية: النسخ الميداني اليدوي

وبدلاً من ذلك، يمكنك نسخ الحقول يدويًا من A إلى B كما يلي:

func main() { البنية A := أ {أ: 42، ب: "فو"} البنية ب := ب{ ج: structA، // انسخ الحقول من structA ج: "شريط"، }
type A struct {
    a int
    b string
}

type B struct {
    A
    c string
}
تتضمن هذه الطريقة إنشاء مثيل جديد لـ B وتعيين الحقول يدويًا من A.

الطريقة الثالثة: طريقة التحويل الصريحة

خيار آخر هو إنشاء طريقة تحويل صريحة تحول A إلى B. وقد يكون هذا مفيدًا إذا كان لديك منطق تحويل معقد. ومع ذلك، فإن هذا النهج ليس ضروريًا في هذه الحالة، حيث توفر الطرق المذكورة أعلاه طريقة مباشرة لتحقيق التحويل المطلوب.

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

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

Copyright© 2022 湘ICP备2022001581号-3