Go学习之旅之内置函数 |Go主题月

158 阅读1分钟

前文链接:juejin.cn/post/695690…

(1)close

用来关闭channel

(2)panic和recover

Go语言中没有异常处理机制,这一点与c/c++中有try...catch不同。Go中将每种错误都用具体的值表示,这就避免了用try和catch时,出现了错误,但找不到错误在哪。所以Go中存在了很多的if....else..,便于对每种异常进行判断。

但是没有考虑到异常时,程序出错,占用内存,这个时候就需要用panic和recover来处理错误。

panic可以在任何地方引发,但recover只有在defer调用的函数中有效。

例子如下:

package main
import "fmt"

//panic/recover

func funcA() {
	fmt.Println("func A")
}

func funcB() {
	panic("panic in B")
}

func funcC() {
	fmt.Println("func C")
}

func main(){
		funcA()
		funcB()
		funcC()
}

输出结果:

func A
panic: panic in B

goroutine 1 [running]:
main.funcB(...)
        /Users/tjm/goproject/src/gocode/chapter03/panic/main.go:11
main.main()
        /Users/tjm/goproject/src/gocode/chapter03/panic/main.go:20 +0x96
exit status 2

通过recover恢复,使程序继续正常运行。

func funcA() {
	fmt.Println("func A")
}

func funcB() {
	defer func() {
		err := recover()
		//如果程序出出现了panic错误,可以通过recover恢复过来
		if err != nil {
			fmt.Println("recover in B")
		}
	}()
	panic("panic in B")
}

func funcC() {
	fmt.Println("func C")
}
func main() {
	funcA()
	funcB()
	funcC()
}

要点:

  • panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码,并在当前 Goroutine 中递归执行调用方的 defer
  • recover 可以中止 panic 造成的程序崩溃。它是一个只能在 defer 中发挥作用的函数,在其他作用域中调用不会发挥作用;