# 函數知識點小問題
* * * * *
--: 作者: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)
}
```