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

لماذا لا يؤثر تعديل المؤشر في وظائف Go أحيانًا على القيمة الأصلية؟

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

 Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

تعديل المؤشر في Go، فهم الاختلافات

في Go، عند تمرير مؤشر إلى وظيفة، نعتزم عادةً تعديل القيمة أشار إليه ذلك المؤشر. عادةً، يمكن تحقيق ذلك من خلال إلغاء الإسناد، كما هو موضح في الكود التالي:

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    *p = Test{4}
}

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

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 2
}

func f(p *Test) {
    // Attempt to modify the pointer value
    p = &Test{4}
}

يحاول مقتطف التعليمات البرمجية هذا تعديل قيمة المؤشر p، لكنه يفشل في تغيير قيمة البنية المشار إليها في الأصل. والسبب في ذلك هو أن التعيين p = &Test{4} داخل الدالة f() يعدل فقط قيمة المتغير المحلي p.

داخل الدالة f()، يتم التعامل مع p كمتغير محلي وتعيين قيمة جديدة لها لا يؤثر على قيمة المؤشر الذي تم تمريره من الدالة main(). وبالتالي، تظل البنية المشار إليها بواسطة p دون تغيير، وتنعكس في القيمة غير المتغيرة لـ i.Value عند طباعتها.

في المقابل، يوضح التعليمة البرمجية التالية النهج الصحيح لتعديل قيمة البنية:

type Test struct {
    Value int
}

func main() {
    i := Test{2}
    p := &i
    f(p)
    println(i.Value) // Output: 4
}

func f(p *Test) {
    p.Value = 4
}

في هذا الكود، p.Value = 4 يعدل مباشرة حقل القيمة للبنية المشار إليها بواسطة p. وينتج عن هذا التعديل المطلوب لقيمة البنية، وهو ما ينعكس في القيمة المحدثة لـ i.Value عند طباعتها.

من الجدير بالذكر أنه يتم تعيين قيمة جديدة للمؤشر نفسه (كما في p = &Test{ 4)) له تأثير مختلف. ستؤدي هذه المهمة إلى إنشاء مؤشر جديد يشير إلى بنية جديدة، ولكنها لن تؤثر على قيمة البنية التي يشير إليها المؤشر الأصلي الذي تم تمريره من الدالة main().

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

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

Copyright© 2022 湘ICP备2022001581号-3