Exception 错误是值(blog)-逻辑上相同吗?

Exception 错误是值(blog)-逻辑上相同吗?,exception,error-handling,exception-handling,go,Exception,Error Handling,Exception Handling,Go,我刚读了罗伯·派克写的那本书。关于这一点,我有一个小问题,可能我也可能是错的,但我仍然希望得到反馈,并正确理解这一过程 在博客中有一段代码片段(实际上是由@jxck\ux编写的) a) 根据我的理解,如果在fd.Write(p0[a:b])发生错误,上述代码将返回,并且永远不会执行fd.Write(p1[c:d]),对吗 罗伯建议写这样的东西 var err error write := func(buf []byte) { if err != nil { return

我刚读了罗伯·派克写的那本书。关于这一点,我有一个小问题,可能我也可能是错的,但我仍然希望得到反馈,并正确理解这一过程

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

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) 基于上述情况,看起来该错误将从子函数返回。这意味着如果错误发生在写入时(p0[a:b]),那么它仍然会执行写入操作(p1[c:d]),对吗?这就意味着从逻辑上来说两者是不一样的,对吗


任何人都可以解释。

不,他们是一样的。如果
错误
发生在
fd.Write(p0[a:b])
处,则
err
变量将保留其值

现在,如果调用
write(p1[c:d])
,那么
write()
func将首先检查
err!=nil
但由于它已经存储了上次调用中发生的
错误
,因此它将立即返回,并且不会执行进一步的代码。

a)是的,您是正确的。如果错误发生在第一次写入中,它将返回


b) 否。本例中的
写入
是一个错误。内部的
err
与外部的作用域相同。因此,如果第一次写入失败,另一个将直接返回,因为外部的
err
不再是
nil

两个版本在执行的操作方面并不完全相同,因为原始版本在发生错误时使用提前返回,而第二个版本在调用write闭包时检查nil的次数相同。
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
}