"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > गो वेरिएबल कब पहुंच से बाहर हो जाता है, और `runtime.KeepAlive` इसे कैसे रोक सकता है?

गो वेरिएबल कब पहुंच से बाहर हो जाता है, और `runtime.KeepAlive` इसे कैसे रोक सकता है?

2024-11-23 को प्रकाशित
ब्राउज़ करें:472

When Does a Go Variable Become Unreachable, and How Can `runtime.KeepAlive` Prevent It?

गो में वेरिएबल कब अप्राप्य हो जाता है?

गो में, एक वेरिएबल अप्राप्य हो जाता है जब गो रनटाइम यह निर्धारित करता है कि कोड वेरिएबल को दोबारा संदर्भित नहीं करेगा। यह तब भी हो सकता है जब वेरिएबल अभी भी इसके दायरे में है। int } func मुख्य() { d, err := syscall.Open("/file/path", syscall.O_RDONLY, 0) यदि गलती हो तो !=शून्य { वापसी } p := &फ़ाइल{d} रनटाइम.सेटफाइनलाइज़र(p, func(p *फ़ाइल) { syscall.Close(p.d) }) var buf [10]बाइट n, err := syscall.Read(p.d, buf[:]) रनटाइम.KeepAlive(p) }

इस उदाहरण में, syscall.Read कॉल के बाद वेरिएबल p का उपयोग नहीं किया जाता है। हालाँकि, यह अभी भी मुख्य फ़ंक्शन के दायरे में है।रनटाइम पी को पहुंच योग्य नहीं के रूप में चिह्नित कर सकता है क्योंकि इसके फाइनलाइज़र को syscall.Read रिटर्न तक निष्पादित नहीं किया जाएगा। syscall p.d फ़ाइल डिस्क्रिप्टर को संदर्भित करने और उपयोग करने के लिए जिम्मेदार है। इस्तेमाल किया गया। यह फ़ंक्शन रनटाइम को सूचित करता है कि p अभी भी उपयोग किया जा रहा है, भले ही इसे कोड में संदर्भित नहीं किया गया हो। यह सुनिश्चित करता है कि syscall.Read रिटर्न तक फाइनलाइज़र निष्पादित नहीं किया जाएगा। .

runtime.KeepAlive का उपयोग किसी वेरिएबल को स्पष्ट रूप से बनने से रोकने के लिए किया जा सकता है पहुंच योग्य नहीं।

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)
}

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3