Golang合并错误

Lets say you have a simple function as so:

func create(path string) error {
        if err := ioutil.WriteFile(path, []byte{}, 0666); err != nil {
                return err
        }

        if err := os.Chmod(path, 0666); err != nil {
                _ = os.Remove(path)
                return err
        }

        return nil
}

I don't like ignoring the error out of Remove(). But I also don't want to swamp the error out of Chmod() and I don't want to leave the file since we didn't create() it successfully.

This is a simple example, and perhaps the function could be written differently to avoid this, but there are more complex situations that come up and this combining of errors I haven't seen mentioned in the golang community, so whats the idiom?

The solution would be to store the error from Remove in a separate variable, and combine them with fmt.Errorf:

if err := os.Chmod(path, 0666); err != nil {
        if e2 := os.Remove(path); e2 != nil {
            return fmt.Errorf("error changing permissions (%v); error deleting file (%v)", err, e2)
        }
        return err
}

You may have a look at my library for streamlined error handling and piping of function calls https://github.com/go-on/queue Example of usage:

import "github.com/go-on/queue/q"

func main() {
    u := &User{}
    err := q.Q(                      
        ioutil.ReadAll, rq.Body,  // read json (returns json and error)
    )(
        // q.V pipes the json from the previous function call
        json.Unmarshal, q.V, u,   // unmarshal json from above  (returns error)
    )(
        u.Validate,               // validate the user (returns error)
    )(
        u.Save,                   // save the user (returns error)
    )(
        ok, w,                    // send the "ok" message (returns no error)
    ).Run()

    if err != nil {
       switch err {
         case *json.SyntaxError:
           ...
       }
    }
}