持续创作,加速成长!这是我参与「掘金日新计划 · 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
}