Golang返回功能

时间:2018-01-16 21:05:46

标签: go nested-function

  

任何人都可以解释为什么打印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而不是其他任何东西?谢谢!

5 个答案:

答案 0 :(得分:7)

让我们按照程序流程进行操作:

  1. main开始。
  2. main来电makeFunction
  3. makeFunction打印00000,并返回匿名函数。
  4. 回到main,我们调用前一次调用返回的匿名函数。
  5. 匿名函数调用makeFunction2
  6. makeFunction2打印11111,并返回匿名函数。
  7. main返回。
  8. 因为在上面的步骤6之后丢弃了返回值,所以没有打印任何其他内容。

答案 1 :(得分:4)

让我们看一下你的main

第1行

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

第2行

f()

相当于:

_ = f()
  • 副作用:打印“11111”
  • 返回值:执行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;