go语言函数相关

  1. 函数类型

函数类型也叫作函数签名, 就是函数定义首行去掉函数名、参数名和{,可以使用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) // 
}
  1. 匿名函数
    匿名函数可以看做函数字面量,所有直接使用函数类型变量的地方都可以由匿名函数代替。匿名函数可以直接赋值给函数变量,可以当做实参,也可以作为返回值,也可以直接被调用
package main

import "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)
}

你可能感兴趣的:(go)