Golang如何优雅处理错误(2)

82 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

如何应对头疼的error check?

err := dosomething(1)
if err != nil {
// resp to do 1
   return err
}

err=dosomething(2)
if err != nil {
// resp to do 2
   return err
}

err=dosomething(3)
if err != nil {
// resp to do 3
   return err
}

凡是发现重复的模式出现,都是可以简化的地方,讲讲如何优化。
优化1: 函数式编程
思路: 变量err接收各环节,公共流程封入闭包函数

    var err error
    ds := func(data int) {
        if err != nil {
            return
        }
        err = dosomething(data)
    }

    ds(1)
    ds(2)
    ds(3)

    if err != nil {
        return err
    }
    return nil

通过使用闭包函数把相同的代码给抽出来重新定义一个函数,这样大量的 if err!=nil 处理得很干净了,但是会带来一个问题,发现需要新增一个 err 变量和闭包函数,是否有更简洁方式实现?
优化2: 结构体和成员函数
思路: err作为结构体变量,闭包函数作为结构体成员函数封装起来

type SomeThing struct {
    err error
}

func (st *SomeThing) do(data int) {
    if st.err == nil {
        st.err = dosomething(data)
    }
}
func parse(input io.Reader) (*Point, error) {
    
    someThing := SomeThing{}

    someThing.do(1)
    someThing.do(2)
    someThing.do(3)
    
    if someThing.err != nil {
        return nil, r.err
    }

    return nil
}