会发生什么,从够程返回值

问题描述 投票:9回答:5

可能有人请给从够程返回澄清值。是否从够程返回值获得存储在股权。

例如:

// 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)
    }

我们应该尽量避免在价值去例行回报?

function go goroutine
5个回答
13
投票

看着装配输出显示快一点

$ 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 ,

所以,当它是从一个叫做够程,它的结果存储到堆栈中。然而,这是当够程结束,所以没有检索返回值的可能性,这是摧毁了一个新的堆栈。

"".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 ,

当然,也不能获取这些结果的方式。


10
投票

Go Language specification: Go statements报价:

如果函数有任何的返回值,它们在功能完成时丢弃。

因此,它被允许,返回值够程执行功能 - 没有什么不妥之处,并规范明确指出,其返回值被直接丢弃,也不会引起任何错误,但你不会在通常的方式得到它(你会直接调用函数)。


0
投票

值也被删除。并没有什么特别的go声明。你也可以写

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

要不就

...
getNumber(i)
...

甚至


0
投票

与其他大多数编程语言,围棋程序不使用堆栈,用于存储结果,并返回地址。它有一个特殊的内存分配执行完毕后破坏自己。你可以看到在罗勃·派克的谈话(的golang创始人)有关的细节。访问此链接的YouTube视频:https://www.youtube.com/watch?v=f6kdp27TYZs&index=4&list=LLRA7nvHOCb4nuU7byESOYIg


0
投票

FYI:如果你试图功能结果分配给VAR,就像这样:

res := go printNumber(i)

你会得到语法错误是这样的:

prog.go:4:7: syntax error: unexpected go, expecting expression

你可以检查出来here

© www.soinside.com 2019 - 2024. All rights reserved.