golang 函数是一等公民

在golang中,函数不仅可以对计算逻辑进行封装,逻辑解耦,还可以作为一个普通的类型使用,赋值给变量,在方法间传递,进行类型判断和转换等。

一等公民

申明一个函数类型

type myOperate func(int, int) int

创建一个函数

func myAdd(a, b int) int { return a + b + 100 }
注意这里的函数签名和在一开始申明的函数类型是保持一致的

使用

func TestFuncType(t *testing.T) { var op myOperate op = myAdd t.Log(op(1, 2)) }
  1. 首先定义了个一个变量op类型是一开始申明的函数类型:myOperate
  1. 将我们的函数myAdd赋值给变量op
  1. 调用op,验证程序的正确性

高阶函数

满足任一条件即可称为高阶函数
  1. 接收其他函数作为参数传入
  1. 把其他函数作为返回值

高阶函数1

func calc(op myOperate, a, b int) int { return op(a, b) } func TestFuncType(t *testing.T) { var op myOperate op = myAdd t.Log(calc(op, 1, 23)) }
定义高阶函数calc, 其第一个参数类型为我们一开始定义的函数类型: myOperate, 其满足条件1,所以可以说它是一个高阶函数。

高阶函数2

func TestFuncType(t *testing.T) { var op myOperate op = genFun("+") t.Log(calc(op, 1, 23)) } func genFun(op string) myOperate { return func(a, b int) int { if op == "+" { return a + b } else if op == "-" { return a - b } else { return a * b } } }
高阶函数genFun返回值为一开始定义的函数类型: myOperate. 满足高阶函数定义的条件2. 所以说这也能称为一个高阶函数。
java佬进军golang,对很多golang的特性还不是很了解,特地写写练练。