一.函数变量

  • 在Go语言中函数也是一种类型,函数有多少种形式,函数变量就有多少种写法

    1. var a func() //无参数无返回值
    2. var b func(int) //有一个int类型参数
    3. var c func(int) string //有一个int类型参数和string类型返回值
    4. fmt.Println(a, b, c) //输出:<nil> <nil> <nil>
  • 定义完函数变量后,可以使用匿名函数进行赋值.也可以使用已经定义好的函数进行赋值

  • 函数变量定义以后与普通函数调用语法相同,变量名就是普通函数声明的函数名 ```go func main() { var a func() a = func() {

    1. fmt.Println("执行函数")

    } //注意此处没有括号,有括号表示调用函数,变量a就表示接收函数返回值 a() //调用函数

    /* 也可以使用短变量方式定义函数变量 等效于 func b(s string){

    1. //...

    } */ b := func(s string) {

    1. fmt.Println("执行第二个函数")

    } b(“参数”)

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

func c() { fmt.Println(“c函数”) }

  1. - 函数类型变量是除了slicemapchannelinterface外第五种引用类型
  2. ```go
  3. func main() {
  4. var a func()
  5. a = b
  6. a()
  7. var c func()
  8. c = a
  9. c()
  10. fmt.Printf("%p %p", a, c)//输出地址相同
  11. }
  12. func b() {
  13. fmt.Println("b")
  14. }

二. 函数作为参数或返回值

  • 变量可以作为函数的参数或返回值类型.而函数既然可以当做变量看待,函数变量也可以当做函数的参数或返回值
  • 函数作为参数时,类型写成对应的类型即可 ```go func main() { a(func(s string) {
    1. fmt.Println(s)
    }) }

func a(b func(s string)) { fmt.Println(“a执行”) b(“传递给s的内容”) }

  1. - 函数作为返回值
  2. ```go
  3. func main() {
  4. //此时result指向返回值函数.
  5. result := a()
  6. //调用函数,才能获取结果
  7. fmt.Println(result())
  8. }
  9. func a() func() int {
  10. return func() int {
  11. return 110
  12. }
  13. }