Go的函数和defer、panic、recover关键字

发布于 2023-10-12  193 次阅读


目标:Go的函数简单应用和defer、panic、recover关键字

函数的用法

函数是基本的代码块,用于执行一个任务。

Go 语言最少有个 main() 函数。

你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。

函数声明告诉了编译器函数的名称,返回类型,和参数。

Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。

简单的函数应用

 // 示例
package main

import "fmt"

// 函数参数传递的时候,值传递,引用传递,go语言中全部都是值传递
func add(a, b int, c float32) (sum int, err error) {
	sum = a + b
	return
}

// 传递n个参数
func addItem(items ...int) (sum int, err error) {
	// 方法1
	for i := 0; i < len(items); i++ {
		sum += items[i]
	}

	// 方法2
	sum = 0
	for _, value := range items {
		sum += value
	}
	return sum, err
}

func main() {
	// go 函数支持普通函数、匿名函数、闭包
	/*
		go中函数式”一等公民“
			1.函数本身可以当做变量
			2.匿名函数 闭包
			3.函数可以满足接口
	*/
	sum, err := add(1, 2, 2.555)
	fmt.Println(sum)
	fmt.Println(err)

	sum2, _ := addItem(1, 2, 3, 4)
	fmt.Println(sum2)
}

匿名函数

 // 示例
package main

import "fmt"

func callback(x, x2 int, f func(int, int)) {
	f(x, x2)
}

func main() {
	// 匿名函数
	localFunc := func(x int, x2 int) {
		fmt.Printf("total is: %d\r\n\n", x+x2)
	}
	callback(1, 2, localFunc)
}

闭包

 // 示例
package main

import "fmt"

func auto() func() int {
	local := 0
	return func() int {
		local++
		return local
	}
}

func main() {
	// 闭包
	closureFunc := auto()
	sum3 := 0
	for i := 0; i < 5; i++ {
		sum3 = closureFunc()
	}
	fmt.Println(sum3)
}

Error

 // 示例
package main

import (
	"errors"
	"fmt"
)

func A() (int, error) {
	return 0, errors.New("this is an error")
}

func main() {
	if _, err := A(); err != nil {
		fmt.Println(err)
	}
}

关键字

defer

defer 关键字用于确保函数调用在程序执行结束后执行。无论函数因为什么原因结束,都会执行 defer 语句,defer语句的执行顺序是后进先出(LIFO)的。也就是说,最先声明的 defer 语句最后执行,最后声明的 defer 语句最先执行

 // 示例
package main

import "fmt"

func main() {
    fmt.Println("start")
    
    defer fmt.Println("defer 1")
    defer fmt.Println("defer 2")
    defer fmt.Println("defer 3")
    
    fmt.Println("end")
// 结果:
// start
//end
//defer 3
//defer 2
//defer 1
}

panic

是 Go 语言的一个内建函数,它可以用来捕获到 panic 引发的异常,从而使程序从异常中恢复过来,继续执行。recover 只有在 defer 语句中才能捕获到 panic 引发的异常。

 // 示例
package main

import "fmt"

func main() {
    defer fmt.Println("这句话会被打印出来")
    fmt.Println("开始")
    panic("发生了一些不好的事情")
    fmt.Println("结束")  // 这句话不会被打印出来
}

recover

recover 是一个内建的函数,可以用于重新获得 panicking goroutine 的控制并恢复正常执行。recover 只有在延迟函数(defer)中才有效。

 // 示例
package main

import "fmt"

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from", r)
        }
    }()
    fmt.Println("开始")
    panic("发生了一些不好的事情")
    fmt.Println("结束")  // 这句话不会被打印出来
}

间歇性凌云壮志,持续性混吃等死