Home  >  Article  >  Backend Development  >  go - only clean up resources when a function is about to return an error

go - only clean up resources when a function is about to return an error

WBOY
WBOYforward
2024-02-09 11:48:19959browse

go - 仅在函数即将返回错误时清理资源

php editor Baicao introduces you to a technology to clean up resources when a function is about to return an error - "go". This technology can help developers handle resource cleanup work more elegantly when writing code. By using "go", developers can put the resource cleanup logic in a separate function through the defer statement before the function returns an error, thereby avoiding redundancy in the code and cumbersome error handling. The simplicity and efficiency of "go" technology make it the first choice of many PHP developers. Let's take a look at its implementation principles and usage methods!

Question content

Suppose I have a function that first creates a directory and then performs more operations like this:

{
    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
}

Now I want the function to delete the directory it created in all cases where an error occurs. What's the cleanest way?

One way is to call os.removeall in every if branch, but this is not a good solution. Another way is to use the defer statement, but also executed without errors.

Solution

Yes, the delay function will always be executed, but whether it deletes the directory or not is entirely up to you.

Use delay function and check for errors. If there are no errors, do not delete the directory. To do this, use named result parameters, for example:

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)
    
    ...
}

Please note that if there is an explicit return statement, for example:

return path, errors.New("bar")

The return statement above first assigns values ​​to result and err, so in the deferred function you can get/see those values.

View related content: How to return a value in a panicked go function?

The above is the detailed content of go - only clean up resources when a function is about to return an error. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete