一个
defer说法是一个很好的方式,以确保运行的东西不管你怎么退出功能。
在这种特殊情况下,这似乎无关紧要,因为所有错误处理程序都使用
log.Fatal。如果
log.Fatal用
return语句替换s
并删除延迟,则现在必须在许多地方进行清理:
tx, err := db.Begin()if err != nil { return nil,err}stmt, err := tx.Prepare("INSERT INTO foo VALUES (?)")if err != nil { tx.Rollback() return nil,err}defer for i := 0; i < 10; i++ { _, err = stmt.Exec(i) if err != nil { tx.Rollback() return nil,err }}err = tx.Commit()if err != nil { stmt.Close() tx.Rollback() return nil,err}stmt.Close()return somevalue, nil如果使用延迟,则很难忘记需要清理的地方。



