(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中发挥作用的函数,在其他作用域中调用不会发挥作用;