Golang File I/O & OS Interactions Quiz
35 comprehensive questions on Golang's file I/O and OS interaction capabilities, covering file reading/writing, os package usage, streams & buffers, directory operations, and environment variables — with 18 code examples demonstrating practical file and OS operations.
Question 1
How do you read an entire file in Go?
data, err := os.ReadFile("file.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(data))Question 2
How do you write to a file in Go?
data := []byte("Hello, World!")
err := os.WriteFile("output.txt", data, 0644)
if err != nil {
log.Fatal(err)
}Question 3
What is the difference between os.Open and os.OpenFile?
file, err := os.Open("file.txt") // Read-only
file, err := os.OpenFile("file.txt", os.O_RDWR|os.O_CREATE, 0644) // Read/writeQuestion 4
How do you read a file line by line?
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}Question 5
How do you create a directory?
err := os.Mkdir("newdir", 0755)
if err != nil {
log.Fatal(err)
}
// Create nested directories
err = os.MkdirAll("parent/child/grandchild", 0755)Question 6
How do you list directory contents?
files, err := os.ReadDir("mydir")
if err != nil {
log.Fatal(err)
}
for _, file := range files {
fmt.Println(file.Name(), file.IsDir())
}Question 7
How do you get environment variables?
value := os.Getenv("HOME")
fmt.Println("Home:", value)
// Get all environment variables
for _, env := range os.Environ() {
fmt.Println(env)
}Question 8
How do you set environment variables?
err := os.Setenv("MY_VAR", "my_value")
if err != nil {
log.Fatal(err)
}
// Check if set
fmt.Println(os.Getenv("MY_VAR"))Question 9
What is buffered I/O in Go?
file, _ := os.Open("large.txt")
defer file.Close()
bufferedReader := bufio.NewReader(file)
data, err := bufferedReader.ReadString('\n')
// Buffered writer
file, _ = os.Create("output.txt")
bufferedWriter := bufio.NewWriter(file)
bufferedWriter.WriteString("Hello")
bufferedWriter.Flush()Question 10
How do you copy a file in Go?
srcFile, err := os.Open("source.txt")
if err != nil {
log.Fatal(err)
}
defer srcFile.Close()
dstFile, err := os.Create("dest.txt")
if err != nil {
log.Fatal(err)
}
defer dstFile.Close()
_, err = io.Copy(dstFile, srcFile)
if err != nil {
log.Fatal(err)
}Question 11
How do you check if a file exists?
if _, err := os.Stat("file.txt"); os.IsNotExist(err) {
fmt.Println("File does not exist")
} else if err != nil {
log.Fatal(err)
} else {
fmt.Println("File exists")
}Question 12
How do you get file permissions?
info, err := os.Stat("file.txt")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Permissions: %s\n", info.Mode())
fmt.Printf("Is executable: %t\n", info.Mode().Perm()&0111 != 0)Question 13
How do you change file permissions?
err := os.Chmod("file.txt", 0644)
if err != nil {
log.Fatal(err)
}
// Change owner
err = os.Chown("file.txt", uid, gid)Question 14
How do you work with temporary files?
tmpFile, err := os.CreateTemp("", "prefix-*.txt")
if err != nil {
log.Fatal(err)
}
defer os.Remove(tmpFile.Name()) // Clean up
defer tmpFile.Close()
tmpFile.WriteString("temporary data")
// Use tmpFile.Name() for the pathQuestion 15
How do you read from standard input?
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Enter text: ")
scanner.Scan()
text := scanner.Text()
fmt.Println("You entered:", text)Question 16
How do you write to standard output/error?
fmt.Fprintln(os.Stdout, "This goes to stdout")
fmt.Fprintln(os.Stderr, "This goes to stderr")
// Or use os.Stdout/Stderr directly
os.Stdout.WriteString("Direct write\n")Question 17
How do you handle file paths cross-platform?
import "path/filepath"
// Join paths
path := filepath.Join("home", "user", "file.txt")
// Get directory and filename
fmt.Println(filepath.Dir(path)) // home/user
fmt.Println(filepath.Base(path)) // file.txt
// Check if absolute
fmt.Println(filepath.IsAbs(path))Question 18
How do you walk a directory tree?
err := filepath.Walk("rootdir", func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
fmt.Println("Directory:", path)
} else {
fmt.Println("File:", path)
}
return nil
})Question 19
How do you handle file locking?
file, err := os.OpenFile("file.txt", os.O_RDWR, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// Try to lock (Unix only)
err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX)
if err != nil {
log.Fatal(err)
}
defer syscall.Flock(int(file.Fd()), syscall.LOCK_UN)
// Now safe to read/writeQuestion 20
How do you read environment variables with defaults?
port := os.Getenv("PORT")
if port == "" {
port = "8080" // Default value
}
// Or using a helper function
func getEnv(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}
port = getEnv("PORT", "8080")Question 21
How do you append to a file?
file, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
_, err = file.WriteString("New log entry\n")
if err != nil {
log.Fatal(err)
}Question 22
How do you get the current working directory?
cwd, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
fmt.Println("Current directory:", cwd)Question 23
How do you change the current working directory?
err := os.Chdir("/tmp")
if err != nil {
log.Fatal(err)
}
// Verify
cwd, _ := os.Getwd()
fmt.Println("New CWD:", cwd)Question 24
How do you handle large files efficiently?
file, err := os.Open("large.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
buffer := make([]byte, 4096) // 4KB buffer
for {
n, err := file.Read(buffer)
if n > 0 {
// Process buffer[:n]
processChunk(buffer[:n])
}
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
}Question 25
How do you create a pipe for inter-process communication?
r, w, err := os.Pipe()
if err != nil {
log.Fatal(err)
}
go func() {
defer w.Close()
w.WriteString("Hello from child")
}()
buffer := make([]byte, 100)
n, err := r.Read(buffer)
fmt.Println(string(buffer[:n]))
r.Close()Question 26
How do you handle file truncation?
file, err := os.OpenFile("file.txt", os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// File is now empty
file.WriteString("New content")Question 27
How do you read environment variables as integers?
timeoutStr := os.Getenv("TIMEOUT")
if timeoutStr == "" {
timeoutStr = "30"
}
timeout, err := strconv.Atoi(timeoutStr)
if err != nil {
log.Fatal("Invalid TIMEOUT value:", err)
}
fmt.Println("Timeout:", timeout)Question 28
How do you safely remove files and directories?
err := os.Remove("file.txt") // Remove file
err = os.RemoveAll("directory") // Remove directory and contents
// Check if exists before removing
if _, err := os.Stat("file.txt"); !os.IsNotExist(err) {
err = os.Remove("file.txt")
}Question 29
How do you handle symbolic links in Go?
// Read link target
linkTarget, err := os.Readlink("mylink")
// Check if file is a symlink
info, err := os.Lstat("file")
if info.Mode() & os.ModeSymlink != 0 {
fmt.Println("Is a symlink")
}
// Create symlink
err = os.Symlink("target", "linkname")Question 30
How do you implement a simple file-based logger?
type FileLogger struct {
file *os.File
}
func NewFileLogger(filename string) (*FileLogger, error) {
file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return nil, err
}
return &FileLogger{file: file}, nil
}
func (l *FileLogger) Log(message string) {
timestamp := time.Now().Format(time.RFC3339)
l.file.WriteString(fmt.Sprintf("[%s] %s\n", timestamp, message))
}
func (l *FileLogger) Close() {
l.file.Close()
}Question 31
How do you read configuration from environment variables?
type Config struct {
Port int
Database string
Debug bool
}
func loadConfig() Config {
port, _ := strconv.Atoi(getEnv("PORT", "8080"))
database := getEnv("DATABASE", "postgres://localhost")
debug := getEnv("DEBUG", "false") == "true"
return Config{
Port: port,
Database: database,
Debug: debug,
}
}
func getEnv(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}Question 32
How do you handle file I/O errors properly?
func readFile(filename string) ([]byte, error) {
data, err := os.ReadFile(filename)
if err != nil {
if os.IsNotExist(err) {
return nil, fmt.Errorf("file %s does not exist", filename)
}
if os.IsPermission(err) {
return nil, fmt.Errorf("permission denied reading %s", filename)
}
return nil, fmt.Errorf("error reading %s: %w", filename, err)
}
return data, nil
}Question 33
How do you implement a file watcher?
func watchFile(filename string) {
lastMod := time.Time{}
for {
info, err := os.Stat(filename)
if err != nil {
log.Println("Error stat'ing file:", err)
time.Sleep(time.Second)
continue
}
if info.ModTime().After(lastMod) {
fmt.Println("File changed!")
lastMod = info.ModTime()
// Handle file change
}
time.Sleep(time.Second)
}
}Question 34
How do you work with binary files?
type Header struct {
Magic uint32
Version uint16
Count uint32
}
func readBinaryFile(filename string) (*Header, error) {
file, err := os.Open(filename)
if err != nil {
return nil, err
}
defer file.Close()
var header Header
err = binary.Read(file, binary.LittleEndian, &header)
if err != nil {
return nil, err
}
return &header, nil
}Question 35
What is the most important principle for file I/O in Go?
