任何人都可以解释为什么打印0和1而不是其他任何东西?谢谢!
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而不是其他任何东西?谢谢!
答案 0 :(得分:7)
让我们按照程序流程进行操作:
main
开始。main
来电makeFunction
。makeFunction
打印00000
,并返回匿名函数。main
,我们调用前一次调用返回的匿名函数。makeFunction2
。makeFunction2
打印11111
,并返回匿名函数。main
返回。因为在上面的步骤6之后丢弃了返回值,所以没有打印任何其他内容。
答案 1 :(得分:4)
让我们看一下你的main
:
f := makeFunction("hellooo")
makeFunction2("abcef")
的匿名函数,分配给标识符f
f()
相当于:
_ = f()
makeFunction3("safsf")
的匿名函数,被丢弃(您没有指定f()
的返回值)。 makeFunction3
永远不会分配给任何标识符,也永远不会被调用。
答案 2 :(得分:2)
要打印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()
这称为currying或closure,但在你的例子中,你没有关闭任何本地值,因此后者失去了意义。
答案 3 :(得分:0)
makeFunction只返回函数makeFunction2。因为这不是递归函数。如果你希望行为像递归函数,那么你应该将return func(){}改为(返回makeFunction2或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
答案 4 :(得分:0)
原因是它只返回匿名函数。
select Id, Batch_No, System_Id,
max(case when Material_Code = 'Mat01' then set_weight end) as mat01_set_weight,
max(case when Material_Code = 'Mat01' then actual_weight end) as mat01_actual_weight,
max(case when Material_Code = 'Mat02' then set_weight end) as mat02_set_weight,
max(case when Material_Code = 'Mat02' then actual_weight end) as mat02_actual_weight,
max(case when Material_Code = 'Mat03' then set_weight end) as mat03_set_weight,
max(case when Material_Code = 'Mat03' then actual_weight end) as mat03_actual_weight,
max(case when Material_Code = 'Mat04' then set_weight end) as mat04_set_weight,
max(case when Material_Code = 'Mat04' then actual_weight end) as mat04_actual_weight
from Consumption_Report
group by Id, Batch_No, System_Id;