我刚读过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])
,对吗?所以这意味着逻辑上两者都不一样,对吧?
任何人解释。
答案 0 :(得分:3)
error
出现fd.Write(p0[a:b])
,则err
变量将保留其值。
现在,如果您拨打write(p1[c:d])
,那么write()
func将首先检查err != nil
是否已error
,但由于它已经存储了之前通话中发生的{{1}},因此立即返回,不会再执行代码。
答案 1 :(得分:2)
a)是的,你是对的。如果在第一次写入时发生错误,它将返回。
b)否。此示例中的write
是closure。其中的err
内部与外部范围相同。因此,如果第一次写入失败,则另一次只会返回,因为外部err
不再是nil
。