Deferring unsafe method "Close" on type "io.WriteCloser"
199 return err
200 }
201 r.eg.Go(safety.RecoverFunc(func() (err error) {
202 defer pw.Close()203 sr, err := r.storage.Reader(ctx)
204 if err != nil {
205 if errors.Is(err, io.EOF) {
Deferring unsafe method "Close" on type "io.ReadCloser"
192 log.Warn(err)
193 return err
194 }
195 defer pr.Close()196 pw, err = io.NewWriteCloserWithContext(ctx, pw)
197 if err != nil {
198 log.Warn(err)
Deferring unsafe method "Close" on type "io.ReadCloser"
77
78 w.eg.Go(safety.RecoverFunc(func() (err error) {
79 defer w.wg.Done()
80 defer pr.Close() 81
82 return w.upload(ctx, key, pr)
83 }))
Deferring unsafe method "Close" on type "io.WriteCloser"
88 r.wg.Add(1)
89 r.eg.Go(safety.RecoverFunc(func() (err error) {
90 defer r.wg.Done()
91 defer pw.Close() 92
93 var offset int64
94
Deferring unsafe method "Close" on type "*os.File"
62 mt := make(map[string]int64)
63 gob.Register(map[string]int64{})
64 var ft *os.File
65 defer ft.Close() 66 ft, err = file.Open(
67 file.Join(*path, *kvsTimestampFileName),
68 os.O_RDONLY|os.O_SYNC,
Deferring unsafe method "Close" on type "*os.File"
45 m := make(map[string]uint32)
46 gob.Register(map[string]uint32{})
47 var f *os.File
48 defer f.Close() 49 f, err = file.Open(
50 file.Join(*path, *kvsFileName),
51 os.O_RDONLY|os.O_SYNC,
Description
Calling Close()
method may return an error, and ignoring the same
might result in a data loss. This is similar to many more Close
methods.
For example, on POSIX systems, os.Close
uses the close
system call underneath,
which may return an EIO
:
A previously-uncommitted write(2) encountered an input/output error.
This means that the data written by os.Write
hasn't been written to the disk,
which results in a data loss. It is recommended to handle the error returned
by the os.Close
call or call os.Sync
if available to force the OS to write
the data to the disk.
Bad practice
package main
import (
"fmt"
"os"
)
func foo() error {
f, err := os.Create("/tmp/test.txt")
if err != nil {
return err
}
defer f.Close()
return fmt.Fprint(f, "Hello World")
}
Recommended
package main
import (
"fmt"
"os"
)
func foo() error {
f, err := os.Create("/tmp/test.txt")
if err != nil {
return err
}
err = fmt.Fprint(f, "Hello World")
if err != nil {
return err
}
return f.Close()
}
package main
import (
"fmt"
"os"
)
func foo() error {
f, err := os.Create("/tmp/test.txt")
if err != nil {
return err
}
defer f.Close()
err = fmt.Fprint(f, "Hello World")
if err != nil {
return err
}
return f.Sync()
}