目标: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("结束") // 这句话不会被打印出来
}
Comments NOTHING