函数定义

func test( [parameter list] ) [return] {
   函数体
}

函数定义解析:
func 定义函数的关键字
test 函数名称
parameter list 传参
return 返回值

案例:

func Add(a, b int) int {
	return a + b
}

返回多个值:

func main() {
	a, b := Add("hello", "world")
	fmt.Println(a,b)
}

func Add(a, b string) (string, string) {
	return a, b
}

不定参数

func main() {
	Add(1, 2)
	Add(1, 2, 3)
}
func Add(args ...int) {	// 可以接受不固定的参数
	
}

匿名函数和闭包

func main() {
	func () {
		fmt.Println("hello")
	}()	//直接调用
}

defer延迟调用

func main() {
	// defer延迟调用,main函数结束前调用
	defer fmt.Println("b")
	fmt.Println("a")
}

打印结果:
a
b

多个defer

多个defer会先进后出 哪怕某个函数发生错误,这些调用仍然会被执行。

func main() {
	// defer延迟调用,main函数结束前调用
	defer fmt.Println("b")
	defer fmt.Println("a")
}

打印结果:
a
b
c

defer 执行顺序

  1. defer延迟调用会在后面语句执行完毕执行
  2. 在return更新完返回值后再去执行defer
  3. 多个defer会先进后出 第一个defer会最后执行
  4. 判断执行没有err之后,再defer释放资源
func main() {
	file, err := os.Open("./go.mod")
	// 判断是否操作成功
	if err != nil {
		fmt.Printf("open file failed err: %v", err)
		return
	}
	// 延迟调用 操作成功在defer
	defer file.Close()
}

函数作参数

func main()  {
	f1(100, sum)
}

func f1(x int, y func(int, int))  {
	y(x, 2)
}

func sum(x, y int) {
	fmt.Printf("%d", x + y)
}

闭包

func main()  {
	sum := f2(f1, 100, 200)
	sum()
}

func f1(x, y int)  {
	fmt.Println(x + y)
}

func f2(f func(int, int), a, b int) func()  {
	tmp := func() {
		f(a, b)
	}
	return tmp
}