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 而不是其他任何东西?谢谢!
让我们按照程序流程:
main
开始。
main
呼叫 makeFunction
.
makeFunction
打印 00000
,return 是一个匿名函数。
- 回到
main
,我们调用由上一次调用 return 编辑的匿名函数。
- 匿名函数调用
makeFunction2
.
makeFunction2
打印 11111
,return 是一个匿名函数。
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()
}
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 而不是其他任何东西?谢谢!
让我们按照程序流程:
main
开始。main
呼叫makeFunction
.makeFunction
打印00000
,return 是一个匿名函数。- 回到
main
,我们调用由上一次调用 return 编辑的匿名函数。 - 匿名函数调用
makeFunction2
. makeFunction2
打印11111
,return 是一个匿名函数。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()
}