错误处理

1、error接口

  1. //定义error接口
  2. type error interface{
  3. Error() string
  4. }
  5. //调用error接口
  6. func Foo(param int) (n int,err error){
  7. //...
  8. }
  9. n,err:=Foo(0)
  10. if err!=nil{
  11. //错误处理
  12. }else{
  13. //使用返回值
  14. }

2、defer[延迟函数]

语法:defer function_name()
1)defer在声明时不会执行,而是推迟执行,在return执行前,倒序执行defer[先进后出],一般用于释放资源,清理数据,记录日志,异常处理等。
2)defer有一个特性:即使函数抛出异常,defer仍会被执行,这样不会出现程序错误导致资源不被释放,或者因为第三方包的异常导致程序崩溃。
3)一般用于打开文件后释放资源的操作,比如打开一个文件,最后总是要关闭的。而在打开和关闭之间,会有诸多的处理,可能会有诸多的if-else、根据不同的情况需要提前返回

  1. f, = os.open(filename)
  2. defer f.close()
  3. do_something()
  4. if (condition_a) {return}
  5. do_something_again()
  6. if (condition_b) {return}
  7. do_further_things()

4)defer示例

  1. package main
  2. import "fmt"
  3. func deferTest(number int) int {
  4. defer func() {
  5. number++
  6. fmt.Println("three:", number)
  7. }()
  8. defer func() {
  9. number++
  10. fmt.Println("two:", number)
  11. }()
  12. defer func() {
  13. number++
  14. fmt.Println("one:", number)
  15. }()
  16. return number
  17. }
  18. func main() {
  19. fmt.Println("函数返回值:", deferTest(0))
  20. }
  21. /*
  22. one: 1
  23. two: 2
  24. three: 3
  25. 函数返回值: 0
  26. */