2011-01-08 13 views
6

के बराबर जाना है क्या Google go में जावा अंतिम रूप देने जैसी कोई विधि है? अगर मेरे पासGoogle जावा अंतिम रूप विधि

type Foo struct { 
     f *os.File 
     .... 
    } 

func (p *Foo) finalize() { 
    p.f.close()   
} 

मैं कैसे सुनिश्चित कर सकता हूं कि ऑब्जेक्ट कचरा एकत्र होने पर, फ़ाइल बंद हो जाती है?

उत्तर

6

runtime.SetFinalizer आईआईआरसी। लेकिन इसे एक बुरी चीज माना जाता है और कार्यक्रम से बाहर निकलने से पहले चलाने की गारंटी नहीं है

संपादित करें: जैसा कि नीचे बताया गया है, वर्तमान os पैकेज पहले से ही runtime.SetFinalizer फ़ाइलों पर कॉल करता है। हालांकि, SetFinalizer पर भरोसा नहीं किया जाना चाहिए। उदाहरण के तौर पर, मेरे पास फ़ाइल-सर्वर जैसी एप्लिकेशन थी जहां मैं खुली फ़ाइल बंद करना भूल गया था। जीसी ने उन्हें उठाए जाने और उनके फाइनेंजर को बुलाए जाने से पहले प्रक्रिया को लगभग 300 खुली फाइलें मिलेंगी।

+0

आप स्पष्ट रूप से एक os.File बंद नहीं करते हैं इसके निर्माता कहता है 'क्रम उदाहरण के लिए, अगर आप इस (जावा) किया था। SetFinalizer' तो यह gc'ed होने पर बंद हो जाएगा (जैसा कि बताया गया है कि प्रोग्राम बाहर निकलने तक ऐसा नहीं हो सकता है)। अपना खुद का फाइनलाइज़र प्रदान करने की कोई ज़रूरत नहीं है। – nos

+0

@ नहीं हाँ मुझे एहसास है। मुझे लगता है मुझे इसे अपने जवाब में शामिल करना चाहिए लेकिन मैं अपने फोन पर हूं। – cthom06

+0

'SetFinalizer' का उपयोग करने के लिए यह वास्तव में एक बुरा अभ्यास है। इसके बजाय डस्टिन का उत्तर लें: 'defer' कीवर्ड का उपयोग करें। यह संसाधन सफाई के लिए डिज़ाइन किया गया है। – kirakun

15

आप जावा में ऐसा नहीं करेंगे, या तो। जावा में करने के लिए सही चीज finally ब्लॉक है जो इसे खोले जाने के करीब कहीं बंद कर देती है।

सफाई के लिए defer फ़ंक्शन के साथ आप एक समान पैटर्न का उपयोग करेंगे।

try { 
    open(); 
    // do stuff 
} finally { 
    close(); 
} 

जाने में, यदि आप ऐसा करते हैं::

open(); 
defer close(); 
// do stuff 
+2

ध्यान दें कि 'f.close() 'को रोकें संभावित रूप से किसी त्रुटि को अनदेखा करते हैं। यदि आप फ़ाइल में लिख रहे हैं तो यह महत्वपूर्ण हो सकता है। इसे ठीक से कैसे करें इसके लिए https://groups.google.com/d/msg/golang-nuts/GOd-rmqwAME/bPpqFPh9xkkJ यहां देखें। –

+3

खैर, निश्चित रूप से, लेकिन कचरा कलेक्टर को अपनी फाइलों को बंद करने की उम्मीद रखने वाले किसी भी व्यक्ति को पहली जगह में विश्वसनीयता के बारे में ज्यादा परवाह नहीं है। मुझे आम तौर पर करीब त्रुटियों की परवाह नहीं है क्योंकि मेरे पास आमतौर पर कोई अन्य विकल्प नहीं है। – Dustin

संबंधित मुद्दे