可以将函数赋值给变量,可以将函数传递给函数,甚至可以编写创建并返回函数的函数。

func add() int {
return 1 + 1
}


adds := add
fmt.Println(adds())

调用函数的时候需要用到圆括号,单这次的程序在赋值的时候并没有这样做,这里把add()赋给变量adds,通过adds()来调用函数。adds变量的类型是函数,具体来说就是一个不接收任何形参并且只返回一个值的函数。

因为变量既可以指向函数,又可以作为参数传递给函数,所以同样可以在go里面将函数传递给其他函数。

func add() int {
return 1 + 1
}

func addone(add func() int) int {
return add()
}

adds := add
fmt.Println(addone(adds))

这里addone函数中的参数就是一个函数,调用addone时,先把add函数赋予一个变量,然后这个变量当做addone中的参数进行调用。当然也可以直接传递add进行调用。

再看个返回函数的例子

type ok func() int

func okone(a ok) ok {
return func() int {
return a()
}
}

func add() int {
return 1 + 1
}

adds := add
me := okone(adds)
fmt.Println(me())

okone有一个函数参数,并且返回也是一个函数参数,返回的函数相当于调用的就是参数的函数。

还可以把匿名函数赋给变量,就像使用其他函数那样使用变量

f := func() {
fmt.Println("hello")
}
f()

也可以不赋予变量,直接在后面加入括号进行调用

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