golang不同于java和php,更多的是面向函数式编程,没有class(golang的面向对象是类型type,而不是class), 对于phper需要适应,下面总结函数的使用,以及函数作为参数在函数中的使用

1.函数是一种类型,因此可以将某个定义的函数作为参数传递给其他的函数 ,譬如下面是一个函数的定义

func(r int) int {
	return r
}

2.函数是可以执行的,带有返回值的,因此,可以将一个执行的函数(func(r int) int { return r}())作为参数传递给其他函数,执行函数的返回值作为参数传递给其他的函数,因此执行函数的返回值满足参数的类型即可。 譬如下面是一个函数的执行(定义后执行)

s := 1
func(r int) int {
	return r
}(s)

1.一个简单的数值计算

package main

import (
	"fmt"
)

func main() {
	s := 1
	s = s + 1
	s = s * 2
	fmt.Println(s)
}
4

2.把计算改成函数,依次调用

package main

import (
	"fmt"
)

func main() {
	s := 1
	t := addOne(s)
	r := x2(t)
	fmt.Println(r)
}

func addOne(s int) int {
	return s + 1
}

func x2(s int) int {
	return s * 2
}
4

3.函数套用调用,也就是第一个函数的结果直接作为传输传递给另外一个函数

package main

import (
	"fmt"
)

func main() {
	s := 1
	r := x2(addOne(s))
	fmt.Println(r)
}

func addOne(s int) int {
	return s + 1
}

func x2(s int) int {
	return s * 2
}
4
addOnefunc
package main

import (
	"fmt"
)

func main() {
	s := 1
	r := addOne(s, x2)
	fmt.Println(r)
}

func addOne(s int, f func(t int) int) int {
	s = s + 1
	return f(s)
}

func x2(s int) int {
	return s * 2
}

4

函数本身也是一种类型,因此作为作为参数传递给其他的函数

func addOne(s int, f func(t int) int) int {
	s = s + 1
	return f(s)
}
func(t int) int
x2()addOne(s, x2)f(s)

5.

package main

import (
	"fmt"
)

func main() {
	s := 1
	r := addOne(s, func(s int) int {
		return s * 2
	})
	fmt.Println(r)
}

func addOne(s int, f func(t int) int) int {
	s = s + 1
	return f(s)
}

4

去掉x2函数,直接写一个匿名函数传递

addOne
package main

import (
	"fmt"
)

func main() {
	s := 1
	r := addOne(s, x3())
	fmt.Println(r)
}

func addOne(s int, f func(t int) int) int {
	s = s + 1
	return f(s)
}

func x3() func(t int) int {
	return func(s int) int {
		return s * 2
	}
}
4
generateFc()
package main

import (
	"fmt"
)

var x3 = generateFc()

func main() {
	s := 1
	r := addOne(s, x3())
	fmt.Println(r)
}

func addOne(s int, f func(t int) int) int {
	s = s + 1
	return f(s)
}

func generateFc() func() func(t int) int {
	return func() func(t int) int {
		return func(t int) int {
			return t * 2
		}
	}

}

4
func(t int) intfunc() func(t int) int func(t int) intfunc() func(t int) int
func x3() func(t int) int {
	return func(s int) int {
		return s * 2
	}
}
func() func(t int) int
x3x3generateFc()

因此你会发现:

a>函数是有类型的,只要传递参数和返回参数一致,就代表类型一样

b>函数可以直接定义,也可以通过执行一个函数得到返回值的方式定义

func() func(t int) intfunc(t int) int

8.优化第7步骤的函数

package main

import (
	"fmt"
)

var x3 = generateFc()

type Ware func(t int) int
type Mdware func() Ware

func main() {
	s := 1
	r := addOne(s, x3())
	fmt.Println(r)
}

func addOne(s int, f Ware) int {
	s = s + 1
	return f(s)
}

func generateFc() Mdware {
	return func() Ware {
		return func(t int) int {
			return t * 2
		}
	}

}

这样易读性好很多

总结:上面这么多的写法,都可以实现1部分的执行, 在golang的包使用中起着很重要的作用,可以通过函数的妙用添加多种中间件