- 函数类型
函数类型也叫作函数签名, 就是函数定义首行去掉函数名、参数名和{,可以使用fmt.Printf 的”%T”格式化参数打印函数的类型。
可以使用 type 定义函数类型,函数类型变量可以作为函数的参数或返回值。
实际函数类型变量和函数名都可以当作指针变量,该指针指向函数代码 开始位置
func add(a int, b int) int {return a + b
}
func sub(a int, b int) int {return a - b
}
type Op func(int, int) int; // 定义一个函数类型,
type FuncTypeVar struct {f Op
}
func do(f Op, a int, b int) int {return f(a, b)
}
func main() {a := do(add, 2, 3) //函数名 add 可以当作相同函数类型形参,不需强制类型转换fmt.Println(a)b := do(sub, 3, 2)fmt.Println(b)temp := &FuncTypeVar{}fmt.Println(temp.f) // <nil>
}
- 匿名函数
匿名函数可以看做函数字面量,所有直接使用函数类型变量的地方都可以由匿名函数代替。匿名函数可以直接赋值给函数变量,可以当做实参,也可以作为返回值,也可以直接被调用
package mainimport "fmt"//匿名函数被直接赋值函数变量
var sum = func(a int, b int) int {return a + b
}
func doinput(f func(int, int) int, a int, b int) int { //func(int, int) int 为函数类型return f(a, b)
}
// 匿名函数作为返回值
func wrap(op string) func (int, int) int {switch op {case "add":return func(a int, b int) int {return a + b}case "sub":return func(a int, b int) int {return a - b}default :return nil}
}
func main() {// 匿名函数直接执行defer func() {fmt.Println("this is anonymity function")}()sum(1, 2)// 匿名函数作为实参doinput(func(x int, y int) int{return x + y}, 1, 2)opFunc := wrap("add")re := opFunc(2, 3)fmt.Println(re)
}