2015-01-09 5 views
6

से वापसी मूल्य का क्या होता है कोई व्यक्ति कृपया goroutine से वापस स्पष्टीकरण मूल्य दे सकता है। क्या गोराउटिन से लौटाया गया मूल्य हिस्सेदारी पर संग्रहीत हो रहा है।goroutine

उदाहरण:

// function getNumber returns the "int i" and we can't use this returned value 
// because this function is invoked as goroutine. 
// We know that, to communicate between main and goroutine one could 
// use the channel (chan <- i), but I am interested to know about 
// the use of return i in goroutine. Is it possible to get/ use this 
// returned value. 
func getNumber(i int) int { 
    return i 
    } 

func main() { 

    for i:=0; i<10; i++ { 
     go printNumber(i) 
     } 
    time.Sleep(5) 
    } 

हम वापसी जाने दिनचर्या में महत्वपूर्ण से बचने की कोशिश करनी चाहिए?

उत्तर

11

विधानसभा उत्पादन को देखने का एक त्वरित बिट से पता चलता

$ go build -gcflags -S z.go 

getNumber() समारोह ढेर

"".getNumber t=1 size=16 value=0 args=0x10 locals=0x0 
    0x0000 00000 (z.go:5) TEXT "".getNumber+0(SB),4,$0-16 
    0x0000 00000 (z.go:6) MOVQ "".i+8(FP),BX 
    0x0005 00005 (z.go:6) MOVQ BX,"".~r1+16(FP) 
    0x000a 00010 (z.go:6) RET , 

तो करने के लिए अपने परिणामों की दुकान करता है जब यह एक goroutine से कहा जाता है, यह संग्रहीत करता है इसके परिणाम ढेर के लिए। हालांकि यह एक नया ढेर है जो गोरौटाइन समाप्त होने पर नष्ट हो जाता है इसलिए वापसी मूल्य को पुनः प्राप्त करने की कोई संभावना नहीं है।

"".main t=1 size=96 value=0 args=0x0 locals=0x18 
    0x0000 00000 (z.go:9) TEXT "".main+0(SB),$24-0 
    0x0000 00000 (z.go:9) MOVQ (TLS),CX 
    0x0009 00009 (z.go:9) CMPQ SP,16(CX) 
    0x000d 00013 (z.go:9) JHI ,22 
    0x000f 00015 (z.go:9) CALL ,runtime.morestack_noctxt(SB) 
    0x0014 00020 (z.go:9) JMP ,0 
    0x0016 00022 (z.go:9) SUBQ $24,SP 
    0x001a 00026 (z.go:10) MOVQ $0,AX 
    0x001c 00028 (z.go:10) CMPQ AX,$10 
    0x0020 00032 (z.go:10) JGE $0,74 
    0x0022 00034 (z.go:11) MOVQ AX,"".i+16(SP) 
    0x0027 00039 (z.go:11) MOVQ AX,(SP) 
    0x002b 00043 (z.go:11) MOVQ $"".getNumber·f+0(SB),CX 
    0x0032 00050 (z.go:11) PUSHQ CX, 
    0x0033 00051 (z.go:11) PUSHQ $16, 
    0x0035 00053 (z.go:11) PCDATA $0,$0 
    0x0035 00053 (z.go:11) CALL ,runtime.newproc(SB) 
    0x003a 00058 (z.go:11) POPQ ,CX 
    0x003b 00059 (z.go:11) POPQ ,CX 
    0x003c 00060 (z.go:10) MOVQ "".i+16(SP),AX 
    0x0041 00065 (z.go:10) INCQ ,AX 
    0x0044 00068 (z.go:10) NOP , 
    0x0044 00068 (z.go:10) CMPQ AX,$10 
    0x0048 00072 (z.go:10) JLT $0,34 
    0x004a 00074 (z.go:13) MOVQ $5,(SP) 
    0x0052 00082 (z.go:13) PCDATA $0,$0 
    0x0052 00082 (z.go:13) CALL ,time.Sleep(SB) 
    0x0057 00087 (z.go:14) ADDQ $24,SP 
    0x005b 00091 (z.go:14) RET , 

हालांकि इन परिणामों को पुनर्प्राप्त करने का कोई तरीका नहीं है।

7

Go Language specification: Go statements से हवाला देते हुए: समारोह किसी भी वापसी मान हैं

हैं, वे छोड़ दिए जाते हैं जब समारोह पूरा करती है।

तो यह goroutines के रूप में वापसी मान के साथ काम करता है निष्पादित करने के लिए अनुमति दी है - इसके साथ कुछ भी गलत नहीं है, और विनिर्देश स्पष्ट रूप से कहा गया है कि उनकी वापसी मान बस छोड़ दिए जाते हैं, यह किसी भी त्रुटि का कारण नहीं होगा, लेकिन आप नहीं होगा इसे आमतौर पर प्राप्त करें (जैसा कि आप सीधे फ़ंक्शन को कॉल करते हैं)।

0

मूल्यों को त्याग दिया जाता है। और go कथन के लिए कुछ खास नहीं है। तुम भी लिख सकते हैं

... 
_ = getNumber(i) 
... 

या सिर्फ

... 
getNumber(i) 
... 

भी

0

अन्य प्रोग्रामिंग भाषाओं का सबसे विपरीत, जाओ दिनचर्या परिणाम संग्रहीत करने के लिए ढेर का उपयोग नहीं करता और वापसी पता। इसके लिए एक विशेष स्मृति आवंटन है जो निष्पादन पूरा होने के बाद खुद को नष्ट कर देता है। आप रॉब पाइक (गोलांग के संस्थापक) वार्ता में इसके बारे में विवरण देख सकते हैं। यूट्यूब वीडियो के लिए इस लिंक पर जाएं: https://www.youtube.com/watch?v=f6kdp27TYZs&index=4&list=LLRA7nvHOCb4nuU7byESOYIg

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