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

الهياكل المضمنة في Go: متى يتم التضمين حسب القيمة مقابل بواسطة المؤشر؟

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

Embedded Structs in Go: When to Embed by Value vs. by Pointer?

الهياكل المضمنة في Go: المؤشر مقابل الكائن

عند التعامل مع أجهزة استقبال المؤشر وإنشاء أنواع المؤشر، يجب فهم الفرق بين تضمين البنية ككائن (B) مقابل المؤشر (*B) يصبح أمرًا بالغ الأهمية. في هذا السياق، تختلف القيم الصفرية لهذين النوعين من البنية المضمنة بشكل كبير.

التضمين المباشر (كائن)

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

type B struct {
    X int
}

func (b *B) Print() { fmt.Printf("%d\n", b.X) }

type AObj struct {
    B
}

var aObj AObj
aObj.Print() // prints 0

دمج المؤشر

في المقابل، يؤدي تضمين مؤشر إلى B (*B) إلى إنشاء سيناريو مختلف. القيمة الصفرية لهذه البنية المضمنة لها قيمة مؤشر صفرية، مما يجعلها غير قابلة للاستخدام مباشرة.

type APtr struct {
    *B
}

var aPtr APtr
aPtr.Print() // panics

نسخ الكائنات

عندما يتم إنشاء كائن AObj، فإنه يحصل على نسخة من الكائن B المضمن. التعديلات التي تم إجراؤها على النسخة لا تؤثر على الكائن الأصلي.

aObj2 := aObj
aObj.X = 1
aObj2.Print() // prints 0

نسخ المؤشرباستخدام APtr، يؤدي إنشاء كائن جديد إلى نسخ المؤشر (*B) ولكن ليس الكائن الملموس الأساسي المشار إليه ل. ولذلك، فإن التعديلات التي يتم إجراؤها على الكائن الجديد تؤثر على كل من الكائنات الأصلية والجديدة.

aPtr.B = &B{} aPtr2 := aPtr أبتر.X = 1 aPtr2.Print() // prints 1
aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3