في Go، يصبح المتغير غير قابل للوصول عندما يحدد وقت تشغيل Go أن الكود لن يشير إلى المتغير مرة أخرى. يمكن أن يحدث هذا حتى لو كان المتغير لا يزال ضمن نطاقه.
مثال:
ضع في اعتبارك مقتطف التعليمات البرمجية التالي:
type File struct { d int } func main() { d, err := syscall.Open("/file/path", syscall.O_RDONLY, 0) if err != nil { return } p := &File{d} runtime.SetFinalizer(p, func(p *File) { syscall.Close(p.d) }) var buf [10]byte n, err := syscall.Read(p.d, buf[:]) runtime.KeepAlive(p) }
في هذا المثال، لم يعد المتغير p مستخدمًا بعد استدعاء syscall.Read. ومع ذلك، فإنه لا يزال ضمن نطاق الوظيفة الرئيسية.
يمكن أن يضع وقت التشغيل علامة p على أنها غير قابلة للوصول لأنه لن يتم تنفيذ أداة الإنهاء الخاصة بها حتى يعود syscall.Read. يعد syscall مسؤولاً عن الرجوع إلى واصف ملف p.d واستخدامه.
وظيفة KeepAlive:
لمنع وضع علامة مبكرة على p على أنه غير قابل للوصول، فإن وظيفة runtime.KeepAlive هي مستخدم. تُعلم هذه الوظيفة وقت التشغيل أن p لا يزال قيد الاستخدام، على الرغم من عدم الإشارة إليه في التعليمات البرمجية. وهذا يضمن عدم تنفيذ أداة الإنهاء حتى إرجاع syscall.Read.
النقاط الرئيسية:
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3