如何在延迟函数中推迟执行参数

时间:2015-08-23 14:55:54

标签: go deferred

defer中的

go计划在函数完成后运行函数调用。 因此1st打印函数fmt.Println("a ", Even())被推迟。但是当调用defer时执行参数时,会立即调用Even()函数。

package main

import "fmt"

func MakeEvenNumber() func() int {
    num :=0
    return func() (ret int) {
        ret = num
        num = num + 2
        return ret
    }
}

func main() {

    Even := MakeEvenNumber()

    defer fmt.Println("a ", Even())

    fmt.Println("b ", Even())
    fmt.Println("c ", Even())
    fmt.Println("d ", Even())
}

输出:

b  2
c  4
d  6
a  0

这是推迟发生的。我只是想知道在延迟函数中停止执行参数的任何方法吗?

就像在这种情况下,输出将是:

b 0
c 2
d 4
a 6

defer fmt.Println("a ", **Even()**)Even()函数将与Println一起执行。

有什么办法吗?

1 个答案:

答案 0 :(得分:3)

如果将fmt.Println调用包装在另一个函数(在这种情况下为匿名函数)中,Even()的评估将在其他Even调用完成后发生:< / p>

func main() {
    Even := MakeEvenNumber()

    defer func() {
      fmt.Println("a ", Even())
    }()

    fmt.Println("b ", Even())
    fmt.Println("c ", Even())
    fmt.Println("d ", Even())
}