Home > Backend Development > Golang > 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
Release: 2024-02-09 11:48:19
forward
1016 people have browsed it

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
}
Copy after login

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)
    
    ...
}
Copy after login

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

return path, errors.New("bar")
Copy after login

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!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template