go -仅当函数将要返回错误时才清除资源

jhkqcmku  于 2023-02-06  发布在  Go
关注(0)|答案(1)|浏览(71)

假设我有一个函数,它从创建一个目录开始,然后做一些其他的事情,像这样:

{
    err := os.Mkdir(path, os.ModePerm)
    ...

    err = doSomething()
    if err != nil {
        return nil, err
    }

    err = doSomethingElse()
    if err != nil {
        return nil, err
    }

    return path, nil
}

现在,我想让函数删除它在所有发生错误的情况下创建的目录,最干净的方法是什么?
一种方法是在每个if分支中调用os.RemoveAll,但这不是一个很好的解决方案;另一种方法是使用defer语句,但这也会在没有错误的情况下执行。

3zwtqj6y

3zwtqj6y1#

是的,一个延迟的函数总是会被执行,但是它是否删除目录完全取决于你。
使用延迟函数,并检查错误。如果没有错误,则不删除目录。要使此操作正常工作,请使用命名结果参数,例如:

func foo() (result resultType, err error) {
    path := "some folder"

    defer func() {
        if err != nil { // This is the result err
            if err2 := os.RemoveAll(path); err2 != nil {
                // handle err2
            }
        }
    }()

    err := os.Mkdir(path, os.ModePerm)
    
    ...
}

请注意,如果存在如下显式return语句:

return path, errors.New("bar")

上面的return语句首先给resulterr赋值,所以在延迟函数中,你可以得到/看到这些值。
参见相关内容:如何在Go语言中返回一个异常的值?

相关问题