3 回答

TA貢獻1777條經(jīng)驗 獲得超3個贊
快速查看匯編輸出顯示
$ go build -gcflags -S z.go
該getNumber()函數(shù)確實將其結(jié)果存儲到堆棧中
"".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 ,
所以當(dāng)它被 goroutine 調(diào)用時,它確實將其結(jié)果存儲到堆棧中。然而,這是一個新的堆棧,它在 goroutine 結(jié)束時被銷毀,因此無法檢索返回值。
"".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 ,
然而,沒有辦法檢索這些結(jié)果。

TA貢獻1827條經(jīng)驗 獲得超9個贊
如果函數(shù)有任何返回值,它們會在函數(shù)完成時被丟棄。
因此允許將返回值作為 goroutine 執(zhí)行函數(shù) - 它沒有任何問題,并且規(guī)范明確指出它們的返回值被簡單地丟棄,它不會導(dǎo)致任何錯誤,但您不會以通常的方式得到它(就像您直接調(diào)用該函數(shù)一樣)。
- 3 回答
- 0 關(guān)注
- 332 瀏覽
添加回答
舉報