<b>check/handle草案</b>
```go
func CopyFile(src, dst string) error {
handle err {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
handle err {
w.Close()
os.Remove(dst) // (only if a check fails)
}
check io.Copy(w, r)
check w.Close()
return nil
}
```
<pre>
感觉是减少了重复代码,但有几点不习惯
a)错误处理在上面,看代码时,会先看到错误处理,打乱思维模式
b)增加了2个关键字,不和谐
c)handle捕获到错误后,会从下面向上一直执行所有handle,与defer混乱
d)handle捕获到错误后,控制交给handle,无法回到之前出错的地方继续向下执行
</pre>
<b>try草案</b>
```go
func CopyFile(src, dst string) (err error) {
defer func() {
if err != nil {
err = fmt.Errorf("copy %s %s: %v", src, dst, err)
}
}()
r := try(os.Open(src))
defer r.Close()
w := try(os.Create(dst))
defer func() {
w.Close()
if err != nil {
os.Remove(dst) // only if a “try” fails
}
}()
try(io.Copy(w, r))
try(w.Close())
return nil
}
```
<pre>
使用内置函数,没增加关键字
该方案感觉同样先处理错误,依然打乱思维模式
try还带括号,看起来不简洁,太多括号
defer中又嵌套if err != nil,感觉类似panic、recover
</pre>
2种草案都被否,也不知道go2.0现在进展怎么样了,谁有新资讯?