2012-11-09 12 views
8

ऑब्जेक्ट उन्मुख भाषाओं में मैं कक्षा चर का उपयोग करता हूं ताकि यह पता चल सके कि निर्माण पर वृद्धि और विनाश पर कमी के कारण वर्तमान में कितने उदाहरण पैदा हुए हैं।किसी प्रकार के उदाहरणों की गिनती का ट्रैक कैसे रखें?

मैं बार में समान व्यवहार को लागू करने का प्रयास करें:

package entity 

type Entity struct { 
    Name string 
} 

func New(name string) Entity { 
    entity := Entity{name} 
    counter++ 
    return entity 
} 

var counter int = 0 

func (e *Entity) Count() int { 
    return counter 
} 

और कहा कि आधे रास्ते मैं एक नाशक के माध्यम से काउंटर घटती नहीं कर सकते हैं के रूप में काम करता है।

क्या मैं किसी भी तरह से वस्तु विनाश की नकल कर सकता हूं? मैं उदाहरण गिनती का सही तरीके से ट्रैक कैसे रखूं?

+0

क्या किसी वस्तु पर संदर्भ गणना दिखाने के लिए कोई अंतर्निहित विधि है? –

उत्तर

9

आप इस तरह runtime.SetFinalizer का उपयोग कर सकते हैं। खेल के मैदान संस्करण के लिए here देखें।

package main 

import (
    "fmt" 
    "runtime" 
) 

type Entity struct { 
    Name string 
} 

var counter int = 0 

func New(name string) Entity { 
    entity := Entity{name} 
    counter++ 
    runtime.SetFinalizer(&entity, func(_ *Entity) { 
     counter-- 
    }) 
    return entity 
} 

func (e *Entity) Count() int { 
    return counter 
} 

func main() { 
    e := New("Sausage") 
    fmt.Println("Entities", counter, e) 
    e = New("Potato") 
    fmt.Println("Entities", counter, e) 
    runtime.GC() 
    fmt.Println("Entities", counter) 
    e = New("Leek") 
    fmt.Println("Entities", counter) 
    runtime.GC() 
    fmt.Println("Entities", counter) 
} 

यह finalizers

साथ gotchas के लिए प्रिंट

Entities 1 {Sausage} 
Entities 2 {Potato} 
Entities 0 
Entities 1 
Entities 0 

डॉक्स से इस नोट

एक्स के लिए finalizer कुछ मनमाने ढंग से समय पर चलने के बाद एक्स पहुँच योग्य नहीं हो जाता है निर्धारित है। इस बात की कोई गारंटी नहीं है कि प्रोग्रामर प्रोग्राम से बाहर निकलने से पहले चलाएंगे, इसलिए आमतौर पर लंबे समय तक चलने वाले प्रोग्राम के दौरान ऑब्जेक्ट से जुड़े गैर-स्मृति संसाधनों को जारी करने के लिए उपयोगी होते हैं।

+0

+1 मैं गलत था क्योंकि मैंने यह नया फ़ंक्शन नहीं देखा था –

5

फाइनलाइजर्स के बारे में गोलांग-नट्स पर discussion था।

अभी के लिए,

  • कोई finalizer समारोह है (संपादित करें: नहीं, कोई विश्वसनीय finalizer समारोह के रूप में निक द्वारा मुझे दिखाया गया था)
  • जीसी उपयोग नहीं करता है और बनाए रखने के नहीं है कोई संदर्भ संख्या

तो आपको अपना उदाहरण स्वयं को प्रबंधित करना होगा।

आमतौर पर, आपके पास अपने आप पर रहने वाले उदाहरण नहीं हैं, इसलिए कई व्यावहारिक उपयोगों (जटिल और जटिल समझने के कार्यक्रम के प्रोफाइल सहित) के लिए, आप अपने चर के जीवन के अंत को ट्रैक करने के लिए defer का उपयोग कर सकते हैं। मैं नाटक नहीं करता कि यह वास्तव में फाइनलाइजर्स को प्रतिस्थापित करता है लेकिन यह सरल और अक्सर पर्याप्त है।

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