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