错误是价值(博客) - 在逻辑上是一样的吗?

时间:2015-02-09 14:56:55

标签: exception error-handling exception-handling go

我刚读过Rob Pike写的blog。我对此有一个小问题,也许我可能也错了,但仍希望得到反馈并正确理解Go。

在博客中有一段代码(实际上是由@jxck _编写的)

_, err = fd.Write(p0[a:b])
if err != nil {
    return err
}
_, err = fd.Write(p1[c:d])
if err != nil {
    return err
}
_, err = fd.Write(p2[e:f])
if err != nil {
    return err
}
// and so on

a)根据我的理解,如果fd.Write(p0[a:b])发生错误,上述代码将返回,并且永远不会执行fd.Write(p1[c:d]),对吗?

罗布建议写这样的东西

var err error
write := func(buf []byte) {
    if err != nil {
        return
    }
    _, err = w.Write(buf)
}
write(p0[a:b])
write(p1[c:d])
write(p2[e:f])
// and so on
if err != nil {
    return err
}

b)基于以上所示,看起来错误将从子函数返回。所以这意味着如果错误发生在write(p0[a:b]),那么它仍会执行write(p1[c:d]),对吗?所以这意味着逻辑上两者都不一样,对吧?

任何人解释。

2 个答案:

答案 0 :(得分:3)

不,他们是一样的。如果error出现fd.Write(p0[a:b]),则err变量将保留其值。

现在,如果您拨打write(p1[c:d]),那么write() func将首先检查err != nil是否已error,但由于它已经存储了之前通话中发生的{{1}},因此立即返回,不会再执行代码。

答案 1 :(得分:2)

a)是的,你是对的。如果在第一次写入时发生错误,它将返回。

b)否。此示例中的writeclosure。其中的err内部与外部范围相同。因此,如果第一次写入失败,则另一次只会返回,因为外部err不再是nil