func关键字后有两个函数名-这是什么?

时间:2018-12-27 05:54:15

标签: go

如何理解最后一个功能? 为什么在func声明之后使用不同的函数名? 如何使用这些功能?像main函数中所示的那样使用它是错误的。

package main

import (
    "fmt"
)

func main() {
    fmt.Println(incrementer()) //error
}

func incrementer() func() int { //what is it?!
    i := 0
    return func() int {
        i++
        return i
    }
}

2 个答案:

答案 0 :(得分:6)

这仅表示该函数正在返回不带参数且返回整数的函数。就是

... func() int 

您的部分签名是说

您得到的错误是因为fmt.Println无法打印功能。为了显示这一点,您可以看到在调用

时遇到相同的错误
func main() {
    fmt.Println(foo)
}

func foo() int {
  return 1
}

如果这样调用函数,可能会更清楚看到发生了什么事情。

func main() {
    myIncrementer := incrementer()
    fmt.Println(myIncrementer()) // Prints 1
}

在创建增量器(即函数)的地方,然后调用该函数返回1。

答案 1 :(得分:4)

由于incrementer()返回一个函数,因此它返回的函数也必须被调用。您可以这样做:

functionFoo := incrementer()
fmt.Println(functionFoo())

或者这种简陋的方式:

fmt.Println(incrementer()())

达到相同的目的后,您只需立即执行incrementer()返回的功能。