Skip to content

Instantly share code, notes, and snippets.

@SVilgelm
Last active June 5, 2019 04:11
Show Gist options
  • Save SVilgelm/603442d451509f06b93114bb6f858ee7 to your computer and use it in GitHub Desktop.
Save SVilgelm/603442d451509f06b93114bb6f858ee7 to your computer and use it in GitHub Desktop.
go: don't defer close on writable files
// https://www.joeshaw.org/dont-defer-close-on-writable-files/
func helloNotes() error {
f, err := os.Create("/home/joeshaw/notes.txt")
if err != nil {
return err
}
defer f.Close()
if err = io.WriteString(f, "hello world"); err != nil {
return err
}
return f.Sync()
}
@SVilgelm
Copy link
Author

SVilgelm commented Jun 5, 2019

Or if we use a log, then

func helloNotes(fileName string) error {
	f, err := os.Create(fileName)
	if err != nil {
		return err
	}
	defer func () {
		if err := f.Close(); err != nil {
			log.Errorf("Error at closing the file '%s': %s", fileName , err)
		}
	}()

	if err = io.WriteString(f, "hello world"); err != nil {
		return err
	}

	return f.Sync()
}

@SVilgelm
Copy link
Author

SVilgelm commented Jun 5, 2019

Or even better with named returns and with logging:

func helloNotes(fileName string) (err error) {
	f, err := os.Create(fileName)
	if err != nil {
		return
	}

	defer func () {
		if cerr := f.Close(); cerr != nil {
			if err == nil {
				err = cerr
			} else {
				log.Errorf("Error at closing the file '%s': %s", fileName , err)
			}
		}
	}()

	err = io.WriteString(f, "hello world")
	if err != nil {
		return
	}

	err = f.Sync()
	return
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment