2016-10-30 21 views
6

के लिए समारोह शाब्दिक द्वारा कब्जा कर लिया मैं सच में यकीन है कि क्या एक 'समारोह शाब्दिक' इस प्रकार इस त्रुटि मुझे थोड़ी भ्रामक है नहीं कर रहा हूँ। मुझे लगता है कि मैं इस मुद्दे को देखने - मैं एक नया जाने दिनचर्या के अंदर से एक रेंज मूल्य चर संदर्भित कर रहा हूँ इस प्रकार मूल्य किसी भी समय बदल सकता है और नहीं भी हो हम क्या उम्मीद करते हैं। इस मुद्दे को हल करने का सबसे अच्छा तरीका क्या है?जाने पशु चिकित्सक रेंज चर जब के अंदर जाने दिनचर्या का उपयोग कर प्रत्येक पाश

प्रश्न में कोड:

func (l *Loader) StartAsynchronous() []LoaderProcess { 
    for _, currentProcess := range l.processes { 
     cmd := exec.Command(currentProcess.Command, currentProcess.Arguments...) 
     log.LogMessage("Asynchronously executing LoaderProcess: %+v", currentProcess) 
     go func() { 
      output, err := cmd.CombinedOutput() 
      if err != nil { 
       log.LogMessage("LoaderProcess exited with error status: %+v\n %v", currentProcess, err.Error()) 
      } else { 
       log.LogMessage("LoaderProcess exited successfully: %+v", currentProcess) 
       currentProcess.Log.LogMessage(string(output)) 
      } 
      time.Sleep(time.Second * TIME_BETWEEN_SUCCESSIVE_ITERATIONS) 
     }() 
    } 
    return l.processes 
} 

मेरे प्रस्तावित ठीक:

func (l *Loader) StartAsynchronous() []LoaderProcess { 
    for _, currentProcess := range l.processes { 
     cmd := exec.Command(currentProcess.Command, currentProcess.Arguments...) 
     log.LogMessage("Asynchronously executing LoaderProcess: %+v", currentProcess) 
     localProcess := currentProcess 
     go func() { 
      output, err := cmd.CombinedOutput() 
      if err != nil { 
       log.LogMessage("LoaderProcess exited with error status: %+v\n %v", localProcess, err.Error()) 
      } else { 
       log.LogMessage("LoaderProcess exited successfully: %+v", localProcess) 
       localProcess.Log.LogMessage(string(output)) 
      } 
      time.Sleep(time.Second * TIME_BETWEEN_SUCCESSIVE_ITERATIONS) 
     }() 
    } 
    return l.processes 
} 

लेकिन वह करता है वास्तव में समस्या का समाधान? मैंने बस रेंज वैरिएबल से संदर्भ को एक अलग स्थानीय चर में ले जाया है जिसका मूल्य प्रत्येक लूप के लिए पुनरावृत्ति के आधार पर है।

उत्तर

5

बुरा यह जाओ में नए आने वालों के लिए एक आम गलती है, और हाँ वर currentProcess प्रत्येक पाश के लिए बदलती है, जिससे आपके goroutines पिछले प्रक्रिया टुकड़ा l.processes में आप का उपयोग करेगा, सभी मत मानो करना है वैरिएबल को अज्ञात फ़ंक्शन के पैरामीटर के रूप में पास करना है, जैसे:

func (l *Loader) StartAsynchronous() []LoaderProcess { 

    for ix := range l.processes { 

     go func(currentProcess *LoaderProcess) { 

      cmd := exec.Command(currentProcess.Command, currentProcess.Arguments...) 
      log.LogMessage("Asynchronously executing LoaderProcess: %+v", currentProcess) 

      output, err := cmd.CombinedOutput() 
      if err != nil { 
       log.LogMessage("LoaderProcess exited with error status: %+v\n %v", currentProcess, err.Error()) 
      } else { 
       log.LogMessage("LoaderProcess exited successfully: %+v", currentProcess) 
       currentProcess.Log.LogMessage(string(output)) 
      } 

      time.Sleep(time.Second * TIME_BETWEEN_SUCCESSIVE_ITERATIONS) 

     }(&l.processes[ix]) // passing the current process using index 

    } 

    return l.processes 
} 
+2

अद्यतन कोड है कि बहुत अच्छा लगता है के लिए धन्यवाद! मैं अपने कोड में एक ऐंठा हुआ बग कि एक घंटे से अधिक ले लिया बहुत कुछ इसी तरह से संबंधित ठीक करने के लिए किया था। मैं यह महसूस करने से पहले [] * लोडरप्रोसेस लौट रहा था कि एक टुकड़ा पहले से ही एक सूचक है इसलिए मैं अनिवार्य रूप से पॉइंटर्स का एक टुकड़ा लौटा रहा था जहां प्रत्येक सूचक एक ही लोडरप्रोसेस उदाहरण की ओर इशारा करता था जो खत्म करने के लिए अंतिम आदेश होता था। निष्पादन के बाद हर बार अलग था। तो दो बड़े सबक कोड के एक टुकड़े से सीखा। धन्यवाद। – anon58192932

1

हां, आपने जो किया वह ठीक करने का सबसे आसान तरीका है यह चेतावनी ठीक से।

ठीक से पहले, केवल एकल चर था, और सभी goroutines इसका जिक्र कर रहे थे। इसका मतलब यह है कि वे लेकिन से जब वे शुरू मूल्य वर्तमान मूल्य नहीं देखा। ज्यादातर मामलों में यह सीमा से आखिरी है।

+0

बहुत बढ़िया धन्यवाद। आप पुष्टि कर सकते हैं कि समारोह शाब्दिक सिर्फ एक समारोह में लाइन में परिभाषित किया गया है? जैसे कि इन-लाइन नियमित रूप से आवश्यक है? – anon58192932

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