Crear un archivo de texto en Go

En Go se escribe un archivo con una sola llamada, os.WriteFile. El resto de la página es lo que necesitas cuando eso no basta: añadir sin borrar, escribir mucho sin ir lento y no pisar un archivo que ya existe.

En una línea

if err := os.WriteFile("notas.txt", []byte("Primera línea\nSegunda línea\n"), 0o644); err != nil {
	log.Fatal(err)
}
salidaescrito: 30 bytes

Crea el archivo si no existe y lo vacía si existe. El 0o644 son los permisos con los que se crea: lectura y escritura para ti, solo lectura para los demás. En Windows se ignoran casi por completo. Y treinta bytes para veintiocho letras porque cada «í» ocupa dos en UTF-8, que es lo que Go usa siempre.

Añadir al final

f, err := os.OpenFile("notas.txt", os.O_APPEND|os.O_WRONLY, 0o644)
if err != nil {
	log.Fatal(err)
}
fmt.Fprintln(f, "Tercera línea")
if err := f.Close(); err != nil {
	log.Fatal(err)
}
salidatras añadir: 45 bytes

OpenFile recibe las opciones combinadas con |. Fíjate en que el error de Close también se comprueba: al escribir, algunos fallos —disco lleno, unidad de red caída— no aparecen hasta que se cierra.

Mucho texto: bufio, y el Flush

g, err := os.Create("muchas.txt")
if err != nil {
	log.Fatal(err)
}
defer g.Close()

w := bufio.NewWriter(g)
for i := 1; i <= 3; i++ {
	fmt.Fprintf(w, "línea %d\n", i)
}
if err := w.Flush(); err != nil {
	log.Fatal(err)
}
salida"línea 1\nlínea 2\nlínea 3\n"

Un escritor con búfer acumula en memoria y escribe al disco en bloques: con miles de líneas, la diferencia de velocidad es enorme. A cambio, lo que no llegues a vaciar con Flush se pierde:

salidasin Flush, el archivo tiene: 0 bytes

Sin error, sin aviso: el archivo se queda vacío. Es el fallo más traicionero de esta página.

Crear solo si no existe

_, err = os.OpenFile("notas.txt", os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0o644)
fmt.Println(err, errors.Is(err, fs.ErrExist))
salidaopen notas.txt: file exists true

La versión anterior de esta página comprobaba con os.Stat si el archivo existía y, si no, lo creaba. Entre una cosa y otra, otro programa puede crearlo, y ahí está el problema. O_EXCL hace las dos cosas a la vez, en una sola operación del sistema: crea el archivo o falla si ya está. Y el error se pregunta con errors.Is(err, fs.ErrExist), no comparando el texto.

Para…Usa
Escribirlo todo de una vezos.WriteFile
Añadir al finalos.OpenFile con O_APPEND|O_WRONLY
Escribir muchobufio.NewWriter y Flush
No pisar nadaO_CREATE|O_EXCL

Más información en inglés: Write a text file in Golang.

Todo el código se compiló y se ejecutó con Go 1.27 en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.