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.
También te puede interesar
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 vez | os.WriteFile |
| Añadir al final | os.OpenFile con O_APPEND|O_WRONLY |
| Escribir mucho | bufio.NewWriter y Flush |
| No pisar nada | O_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.