zoukankan      html  css  js  c++  java
  • golang 用defer 捕获error 需小心

    有时一个函数内需要根据最后是否出错,决定是否执行某个操作。这时候如果函数的分支又比较多,就会比较麻烦了。
    defer 处理这个情况刚好合适

    
    func main() {
    	var err error
    
    	byErr(&err)
    
    	defer byErr(&err)
    
    	defer func(err *error) {
    		byErr2(*err)
    	}(&err)
    
    	err = errors.New("hi,beautiful girl")
    	byErr(&err)
    
    }
    
    func byErr(err *error) {
    	if *err != nil {
    		log.Println("is err")
    	}else {
    		log.Println("is nil")
    	}
    }
    
    func byErr2(err error) {
    	if err != nil {
    		log.Println("is err")
    	}else {
    		log.Println("is nil")
    	}
    }
    
    
    

    结果如下

    2019/06/21 09:25:43 is nil
    2019/06/21 09:25:43 is err
    2019/06/21 09:25:43 is err
    2019/06/21 09:25:43 is err
    

    代码里两种方法都是可行的,但需要注意的是,稍不注意 照以下方式用 就bug了:

    1,如果直接用 err 作为参数,会,恒为nil
    2,如果用err 的指针作为参数, 会恒不为 nil

  • 相关阅读:
    费马小定理
    Big Number阶乘位数计算(斯特林公式)
    V
    矩阵快速幂求斐波那契
    奇迹
    缘分
    求导
    拓扑排序
    线段树
    单调栈
  • 原文地址:https://www.cnblogs.com/mingbai/p/11062753.html
Copyright © 2011-2022 走看看