الهياكل المضمنة في 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 1aPtr.B = &B{}
aPtr2 := aPtr
aPtr.X = 1
aPtr2.Print() // prints 1
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3