GoFile IoBeginner

os.Open() / os.Create()

Functions for opening an existing file for reading or creating a new file for writing, returning an `*os.File` and an error.

Review the syntaxStudy the examplesOpen the coding app
os.Open(name string) (*os.File, error)
os.Create(name string) (*os.File, error)

This static page keeps the syntax and examples indexed for search, while the coding app handles interactive exploration and saved references.

What it does

Overview

Functions for opening an existing file for reading or creating a new file for writing, returning an `*os.File` and an error.

The `os` package provides platform-independent interfaces to operating system functionality, including file I/O. `os.Open(name string)` opens the named file for reading. If the file does not exist, or if the calling process lacks the necessary permissions, it returns an error (e.g., `os.ErrNotExist`). It returns an `*os.File` pointer, which implements the `io.Reader` and `io.Closer` interfaces, allowing you to read data from it. `os.Create(name string)` creates the named file. If the file already exists, `Create` truncates it to zero length, effectively clearing its contents. If the file does not exist, it is created with permission `0666` (read/write for owner, group, and others, subject to umask). Like `Open`, it returns an `*os.File` pointer, which implements `io.Writer` and `io.Closer`. Both functions return an `*os.File` and an `error`. It is critical to always check the error return value and, if a file is successfully opened or created, to ensure it is closed using `defer file.Close()` to prevent resource leaks (e.g., open file descriptors). These functions are fundamental building blocks for interacting with the file system, allowing for stream-based reading and writing, which is efficient for large files.

Quick reference

Syntax

os.Open(name string) (*os.File, error)
os.Create(name string) (*os.File, error)

Inputs

Parameters

namestring · The path to the file to open or create.

See it in practice

Examples

1

Opening a file for reading

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	// Create a dummy file for reading
	dummyFile, _ := os.Create("read_example.txt")
	dummyFile.WriteString("Hello from read_example!")
	dummyFile.Close()

	file, err := os.Open("read_example.txt")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close() // Ensure file is closed

	data, err := io.ReadAll(file)
	if err != nil {
		fmt.Println("Error reading file:", err)
		return
	}
	fmt.Println("Content:", string(data))

	os.Remove("read_example.txt") // Clean up
}
Output:
Content: Hello from read_example!

`os.Open` is used to open an existing file. `io.ReadAll` reads its content, and `defer file.Close()` ensures proper resource management.

2

Creating and writing to a file

package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.Create("write_example.txt")
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	defer file.Close() // Ensure file is closed

	bytesWritten, err := file.WriteString("Hello, Go file system!")
	if err != nil {
		fmt.Println("Error writing to file:", err)
		return
	}
	fmt.Printf("Wrote %d bytes to %s\n", bytesWritten, file.Name())

	os.Remove("write_example.txt") // Clean up
}
Output:
Wrote 24 bytes to write_example.txt

`os.Create` creates a new file. `WriteString` writes data to it. `defer file.Close()` is used for cleanup, and `os.Remove` deletes the file.

3

Handling file not found error with os.Open

package main

import (
	"errors"
	"fmt"
	"os"
)

func main() {
	_, err := os.Open("nonexistent.txt")
	if err != nil {
		fmt.Println("Error opening file:", err)
		// Check if it's specifically a 'file not exist' error
		if errors.Is(err, os.ErrNotExist) {
			fmt.Println("File does not exist, as expected.")
		} else {
			fmt.Println("Another type of error occurred.")
		}
	}
}
Output:
Error opening file: open nonexistent.txt: no such file or directory File does not exist, as expected.

When `os.Open` attempts to open a non-existent file, it returns an error. `errors.Is` is used to specifically check for `os.ErrNotExist`.

Debug faster

Common Errors

1

Forgetting to Close File

Cause: Not calling `file.Close()` after opening or creating a file. This leads to resource leaks (open file descriptors) and can cause issues like files being locked or data not being flushed to disk.

Fix: Always use `defer file.Close()` immediately after a successful `os.Open()` or `os.Create()` call to ensure the file is closed when the function exits.

package main

import (
	"fmt"
	"os"
)

func createLeakyFile() {
	file, err := os.Create("leaky.txt")
	if err != nil {
		fmt.Println("Error creating file:", err)
		return
	}
	// Missing: defer file.Close()
	file.WriteString("This file might stay open!")
	fmt.Println("File created, but not closed.")
}

func main() {
	createLeakyFile()
	// The file 'leaky.txt' might still be open here, consuming a descriptor.
	os.Remove("leaky.txt") // This might fail if the file is still open
}

Runtime support

Compatibility

Go RuntimeN/AGo 1.0+

Source: Go Standard Library Documentation

Common questions

Frequently Asked Questions

Functions for opening an existing file for reading or creating a new file for writing, returning an `*os.File` and an error.

name: The path to the file to open or create.

Forgetting to Close File: Always use `defer file.Close()` immediately after a successful `os.Open()` or `os.Create()` call to ensure the file is closed when the function exits.