内置函数

  
内置函数 介绍
close 主要用来关闭channel
len 用来求长度,比如string,array,slice,map,channel
new 用来分配内存,主要用来分配值类型,比如int,struct。返回指针
make 用来分配内存,主要分配引用类型,比如chan,map,slice
panic和recover 用来处理错误
append 用来追加元素到素组,slice中

panic

go语言目前(Go1.12)是没有异常机制,但是使用panic/recover模式来处理错误。panic可以在任何地方引发,但recover只有在defer调用的函数中有效

go语言中所以错误都是一种值

package main

import "fmt"

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

func funcB() {
  panic("出错了,出现了一个十分严重的错误") //程序执行到这里会打印这句话并完全中断程序,并抛出异常字段
  fmt.Println("B")
}

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

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

上段代码执行结果

[Running] go run "g:\go\practice\panic_recover\main.go"
A //这里只输出了A,因为程序执行到panic后就自动中断了
panic: 出错了,出现了一个十分严重的错误

goroutine 1 [running]:
main.funcB(...)
  g:/go/practice/panic_recover/main.go:10
main.main()
  g:/go/practice/panic_recover/main.go:20 +0x66
exit status 2

修改一下

package main

import "fmt"

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

func funcB() {
  defer func(){
    fmt.Println("释放资源连接.....")
  }()
  panic("出错了,出现了一个十分严重的错误") //程序执行到这里会打印这句话并完全中断程序,并抛出异常字段
  fmt.Println("B")
}

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

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

执行结果

[Running] go run "g:\go\practice\panic_recover\main.go"
A
释放资源连接.....
panic: 出错了,出现了一个十分严重的错误

goroutine 1 [running]:
main.funcB()
  g:/go/practice/panic_recover/main.go:13 +0x49
main.main()
  g:/go/practice/panic_recover/main.go:23 +0x5b
exit status 2

recover

程序运行期间funcB引发了panic导致程序崩溃,异常退出了。这个时候外面就可以通过recover将程序恢复来,继续往后运行

package main

import "fmt"

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

func funcB() {
  defer func(){
    err := recover()
    fmt.Println(err)
    fmt.Println("释放资源连接.....")
  }()
  panic("出错了,出现了一个十分严重的错误") //程序执行到这里会打印这句话并完全中断程序,并抛出异常字段
  fmt.Println("B")
}

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

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

执行结果

A
出错了,出现了一个十分严重的错误
释放资源连接.....
C

recover是可以将panic的错误收集起来的,收集起来并不影响程序后续执行,就是跳过这个错误继续执行下一个

注意recover不要滥用

recover必须搭配defer使用,defer一定要在可能引发panic语句之前定义

posted @ 2023-02-08 20:57  suknna  阅读(27)  评论(0)    收藏  举报