函数变量

  • 在Go语言中函数也是一种类型,函数有多少种形式,函数变量就有多少种写法
    var a func()           //无参数无返回值
    var b func(int)        //有一个int类型参数
    var c func(int) string //有一个int类型参数和string类型返回值
    fmt.Println(a, b, c)   //输出:<nil> <nil> <nil>
  • 定义完函数变量后,可以使用匿名函数进行赋值.也可以使用已经定义好的函数进行赋值

  • 函数变量定义以后与普通函数调用语法相同,变量名就是普通函数声明的函数名

func main() {
    var a func()
    a = func() {
        fmt.Println("执行函数")
    }   //注意此处没有括号,有括号表示调用函数,变量a就表示接收函数返回值
    a() //调用函数

    /*
    也可以使用短变量方式定义函数变量
    等效于
    func b(s string){
        //...
    }
     */
    b := func(s string) {
        fmt.Println("执行第二个函数")
    }
    b("参数")

    //使用定义好的函数
    d := c
    d()
    //函数名称c也是一个变量
    c()
}

func c() {
    fmt.Println("c函数")
}
  • 函数类型变量是除了slice、map、channel、interface外第五种引用类型
func main() {
    var a func()
    a = b
    a()
    var c func()
    c = a
    c()
    fmt.Printf("%p %p", a, c)//输出地址相同
}

func b() {
    fmt.Println("b")
}

函数作为参数或返回值

  • 变量可以作为函数的参数或返回值类型.而函数既然可以当做变量看待,函数变量也可以当做函数的参数或返回值

  • 函数作为参数时,类型写成对应的类型即可

func main() {
    a(func(s string) {
        fmt.Println(s)
    })
}

func a(b func(s string)) {
    fmt.Println("a执行")
    b("传递给s的内容")
}
  • 函数作为返回值
func main() {
    //此时result指向返回值函数.
    result := a()
    //调用函数,才能获取结果
    fmt.Println(result())
}

func a() func() int {
    return func() int {
        return 110
    }
}
原文地址:https://www.cnblogs.com/miaoweiye/p/12095402.html