Golang 返回函数

Golang returning functions

Can anyone explain why 0's and 1's are printed and not anything else? Thank you!

func makeFunction(name string) func() {
    fmt.Println("00000")
    return func() {
        makeFunction2("abcef")
    }
}

func makeFunction2(name string) func() {
    fmt.Println("11111")
    return func() {
        makeFunction3("safsf")
    }
}

func makeFunction3(name string) func() {
    fmt.Println("33333")
    return func() {
        fmt.Printf("444444")
    }
}

func main() {
    f := makeFunction("hellooo")
    f()
}

谁能解释为什么打印的是 0 和 1 而不是其他任何东西?谢谢!

让我们按照程序流程:

  1. main 开始。
  2. main 呼叫 makeFunction.
  3. makeFunction 打印 00000,return 是一个匿名函数。
  4. 回到 main,我们调用由上一次调用 return 编辑的匿名函数。
  5. 匿名函数调用makeFunction2.
  6. makeFunction2 打印 11111,return 是一个匿名函数。
  7. main returns.

因为 return 值在上面的第 6 步之后被丢弃,所以不会打印任何其他内容。

让我们看看你的 main:

第 1 行

f := makeFunction("hellooo")
  • 副作用:打印“00000”
  • Return值:执行makeFunction2("abcef")的匿名函数,赋值给标识符f

第 2 行

f()

相当于:

_ = f()
  • 副作用:打印“11111”
  • Return值:执行makeFunction3("safsf")的匿名函数,被丢弃(你不是在赋值f()的return值)。

makeFunction3 从未分配给任何标识符,也从未被调用。

要打印 3,您必须调用两次:

f()()

要打印 4,只需执行以下操作:

f()()()

因为...

// prints "00000" and returns a function that if run
// will invoked `makeFunction2`
f := makeFunction("hello")

// `makeFunction2` is called, printing "11111" and returns 
// a function that if run will invoked `makeFunction3`
f1 := f()

// `makeFunction3` is called, printing "33333" and returns
// a function that if run will invoked `makeFunction4`
f2 := f1()

测试题,这样做会打印出什么?

f := makeFunction("Hello")()()
f()

这称为柯里化或闭包,但在您的示例中,您没有关闭任何局部值,因此后者失去了意义。

makeFunction 仅 return 函数 makeFunction2。因为这不是递归函数。如果您希望表现得像递归函数,那么您应该将 return func(){} 更改为 (return makeFunction2 or 3)

func makeFunction(name string) func() {
    fmt.Println("00000")
    return makeFunction2("abcef")
}

func makeFunction2(name string) func() {
    fmt.Println("11111")
    return makeFunction3("safsf")
}

func makeFunction3(name string) func() {
    fmt.Println("33333")
    return func() {
        fmt.Printf("444444")
    }
}

func main() {
    f := makeFunction("hellooo")
    f()
}

// Output: 
00000
11111
33333
444444

原因是它只是 returns 匿名函数。

package main

import "fmt"

func makeFunction(name string) func() {
    fmt.Println("00000")
    return func(){
        makeFunction2("abcef")()
    }
}

func makeFunction2(name string) func() {
    fmt.Println("11111")
    return func() {
        makeFunction3("safsf")()
    }
}

func makeFunction3(name string) func() {
    fmt.Println("33333")
    return func() {
        fmt.Printf("444444")
    }
}

func main() {
    f := makeFunction("hellooo")
    f()
}