os.Open / os.Create: *os.File implements io.Reader, io.Writer, io.Closer.defer f.Close() after error checking Open.f, err := os.Open("input.txt")
if err != nil {
return err
}
defer f.Close()
data, err := io.ReadAll(f)
Buffered reads/writes reduce syscalls.
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
_ = line
}
ioutil is deprecated; use os.ReadFile, os.WriteFile, and io.ReadAll.
Use path/filepath for filesystem paths (OS-aware separators), not path (URL-like).
f, err := os.CreateTemp("", "prefix-*")
Design APIs around io.Reader and io.Writer so buffers, files, network, and bytes.Buffer plug in uniformly.
Embed files with embed and serve or read via fs.FS for testable filesystem abstractions.