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

how to defer executing argument in defer function

defer in 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

这是延迟发生的。我只想知道有什么方法可以停止在 defer 函数中执行参数?

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

b 0
c 2
d 4
a 6

defer fmt.Println("a ", **Even()**) 这个 Even() 函数将与 Println.

一起执行

有什么办法吗?

如果将 fmt.Println 调用包装在另一个函数(在本例中为匿名函数),则 Even() 的计算将在对 Even 的其他调用完成后进行:

func main() {
    Even := MakeEvenNumber()

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

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