Trabajo con el sistema de archivos en Go: desde lo básico hasta técnicas avanzadas
Go (Golang) es un lenguaje de programación compilado moderno, conocido por su rendimiento, simplicidad y soporte integrado para trabajar con el sistema de archivos. La capacidad de leer, escribir, crear y gestionar archivos y directorios de manera eficiente es una habilidad clave para cualquier desarrollador de Go. En este artículo, analizaremos en detalle las operaciones básicas con el sistema de archivos utilizando la biblioteca estándar os, io/ioutil (a partir de Go 1.16 se recomienda usar os e io) y path/filepath. Aprenderá cómo abrir y cerrar archivos, leer y escribir datos, trabajar con directorios y recorrer árboles de archivos.
1. Conceptos básicos: apertura, lectura y escritura de archivos
El trabajo con archivos en Go comienza con el paquete os. Para abrir un archivo, se utiliza la función os.Open (solo lectura) o os.OpenFile (para lectura y escritura especificando el modo). Una vez finalizado el trabajo, el archivo debe cerrarse con defer file.Close() para liberar los recursos del sistema.
Lectura completa de un archivo
La forma más sencilla de leer un archivo es usar os.ReadFile (disponible desde Go 1.16). Devuelve un slice de bytes y un error.
package main
import ( "fmt" "os")
func main() { data, err := os.ReadFile("example.txt") if err != nil { fmt.Println("Error al leer el archivo:", err) return } fmt.Println("Contenido del archivo:") fmt.Println(string(data))}Escritura en un archivo
Para escribir datos en un archivo se usa os.WriteFile. Crea o sobrescribe el archivo.
package main
import ( "os")
func main() { content := []byte("¡Hola, mundo!Esta es una línea para escribir.") err := os.WriteFile("output.txt", content, 0644) if err != nil { panic(err) }}Tenga en cuenta el tercer argumento: 0644. Son los permisos de acceso al archivo en estilo Unix (el propietario puede leer y escribir, los demás solo pueden leer).
Lectura y escritura con búfer
Para archivos grandes o procesamiento en flujo, use bufio:
package main
import ( "bufio" "fmt" "os")
func main() { file, err := os.Open("large.txt") if err != nil { panic(err) } defer file.Close()
scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println("Error de escaneo:", err) }}2. Trabajo con directorios
Go proporciona funciones convenientes para crear, eliminar y leer directorios. Las principales se encuentran en el paquete os.
Creación de un directorio
Para crear un solo directorio use os.Mkdir, para directorios anidados use os.MkdirAll.
package main
import ( "os")
func main() { // Creamos un solo directorio err := os.Mkdir("newdir", 0755) if err != nil { panic(err) }
// Creamos directorios anidados err = os.MkdirAll("path/to/nested/dir", 0755) if err != nil { panic(err) }}Lectura del contenido de un directorio
La función os.ReadDir devuelve una lista de elementos en el directorio (a partir de Go 1.16).
package main
import ( "fmt" "os")
func main() { entries, err := os.ReadDir(".") if err != nil { panic(err) }
for _, entry := range entries { fmt.Println(entry.Name(), entry.IsDir()) }}Eliminación de archivos y directorios
Para eliminar use os.Remove (para un archivo o directorio vacío) y os.RemoveAll