内置函数
| 内置函数 | 介绍 |
| 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语句之前定义

浙公网安备 33010602011771号