函數類型也叫作函數簽名, 就是函數定義首行去掉函數名、參數名和{,可以使用fmt.Printf 的”%T”格式化參數打印函數的類型。 可以使用 type 定義函數類型,函數類型變量可以作為函數的參數或返回值。 實際函數類型變量和函數名都可以當作指針變量,該指針指向函數代碼 開始位置
funcadd(a int, b int)int{return a + b
}funcsub(a int, b int)int{return a - b
}type Op func(int,int)int;// 定義一個函數類型,type FuncTypeVar struct{f Op
}funcdo(f Op, a int, b int)int{returnf(a, b)}funcmain(){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
}funcdoinput(f func(int,int)int, a int, b int)int{//func(int, int) int 為函數類型returnf(a, b)}// 匿名函數作為返回值funcwrap(op string)func(int,int)int{switch op {case"add":returnfunc(a int, b int)int{return a + b}case"sub":returnfunc(a int, b int)int{return a - b}default:returnnil}}funcmain(){// 匿名函數直接執行deferfunc(){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)}