# 函数知识点小问题
* * * * *
--: 作者:Mick
时间:2018年10月25日
* * * * *
1:函数实现
2:什么是高阶函数
3:什么是自由变量
4:什么是闭包函数
5:函数签名定义
```
package _func
import "fmt"
type Printer func(contents string)(n int,err error)
func printToStd(c string)(int,error){
return fmt.Println(c)
}
type operate func(x,y int) interface{}
// 通过 calculate函数来实现两个整数间的加减乘除运算,但是希望两个整数和具体的操作都由该函数的调用方给出
func Run(){
//函数实现
//demo1()
//demo2()
//demo3
}
func demo1(){
var p Printer
p = printToStd
fmt.Println(p)
p("some")
}
func demo2(){
add := calculateNew(1,2,func(x int,y int)interface{}{
return x+y
})
fmt.Println(add)
}
func demo3(){
x,y := 56,78
add := genCalculate(func(x,y int)interface{})
result,err := add(x,y)
fmt.Println(result,err)
}
func genCalculate(){
}
func calculateNew(x,y int,op operate) interface{} {
if op == nil {
return 0
}
return op(x,y)
}
```
```
package main
import "fmt"
// 函数是一等公民:参数,变量,返回值都可以是函数
// 高阶函数 参数与返回值是函数
// 函数-》闭包
func adder() func(int)int{
sum := 0
fmt.Printf("%d\n",&sum)
return func(v int) int{
sum += v
fmt.Printf("%d\n",&sum)
return sum
}
}
// 传统函数递归实现
type iAdder func(int)(int,iAdder)
func adder2(base int) iAdder {
return func(v int)(int,iAdder){
return base+v,adder2(base+v)
}
}
func oldAdder(v int)int{
sum := 0
for i:=0;i<v;i++{
sum +=i
}
return sum
}
func main(){
//a := adder()
//a(0)
//a(1)
b := adder2(0)
v1,f1 := b(1)
fmt.Println(v1,f1)
v2,f2 := f1(2)
fmt.Println(v2,f2)
//start := time.Now().UnixNano()
// 闭包求和 451 158 200
//a := adder()
//for i := 0;i < 100000; i++ {
//fmt.Println(a(i))
//}
//oldAdder效率地下2 654 060 200
//for i := 0;i < 100000; i++ {
// fmt.Println(oldAdder(i))
//}
//end := time.Now().UnixNano()
//fmt.Println(start," - ",end," = ",end-start)
}
```