Good Code
The good version defers cleanup immediately after opening the file, so early returns still release the resource.
Lesson 08
Use defer close to make cleanup follow resource acquisition and cover every return path.
func ImportReviews(path string) error {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
if err := importLine(scanner.Text()); err != nil {
return err
}
}
return scanner.Err()
}func ImportReviews(path string) error {
file, err := os.Open(path)
if err != nil {
return err
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
if err := importLine(scanner.Text()); err != nil {
return err
}
}
file.Close()
return scanner.Err()
}The good version defers cleanup immediately after opening the file, so early returns still release the resource.
The bad version closes only on the happy path. If importing a line fails, the file handle leaks until the process cleans it up.