Go by Example: Reading Files

Leer y escribir archivos son tareas básicas necesarias para muchos programas en Go. Primero, veremos algunos ejemplos de lectura de archivos.

package main
import (
    "bufio"
    "fmt"
    "io"
    "os"
)

Leer archivos requiere verificar la mayoría de las llamadas en busca de errores. Este ayudante simplificará nuestras comprobaciones de errores a continuación.

func check(e error) {
    if e != nil {
        panic(e)
    }
}
func main() {

Tal vez la tarea más básica de lectura de archivos sea absorber todo el contenido de un archivo en la memoria.

    dat, err := os.ReadFile("/tmp/dat")
    check(err)
    fmt.Print(string(dat))

A menudo querrás más control sobre cómo y qué partes de un archivo se leen. Para estas tareas, comienza por Open (abrir) un archivo para obtener un valor de os.File.

    f, err := os.Open("/tmp/dat")
    check(err)

Lee algunos bytes desde el principio del archivo. Permite que se lean hasta 5, pero también ten en cuenta cuántos se leyeron realmente.

    b1 := make([]byte, 5)
    n1, err := f.Read(b1)
    check(err)
    fmt.Printf("%d bytes: %s\n", n1, string(b1[:n1]))

También puedes Seek (buscar) una ubicación conocida en el archivo y Read (leer) desde allí.

    o2, err := f.Seek(6, 0)
    check(err)
    b2 := make([]byte, 2)
    n2, err := f.Read(b2)
    check(err)
    fmt.Printf("%d bytes @ %d: ", n2, o2)
    fmt.Printf("%v\n", string(b2[:n2]))

El paquete io proporciona algunas funciones que pueden ser útiles para la lectura de archivos. Por ejemplo, lecturas como las anteriores pueden implementarse de manera más robusta con ReadAtLeast.

    o3, err := f.Seek(6, 0)
    check(err)
    b3 := make([]byte, 2)
    n3, err := io.ReadAtLeast(f, b3, 2)
    check(err)
    fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))

No hay una función incorporada para rebobinar, pero Seek(0, 0) logra esto.

    _, err = f.Seek(0, 0)
    check(err)

El paquete bufio implementa un lector con buffer que puede ser útil tanto por su eficiencia con muchas lecturas pequeñas como por los métodos adicionales de lectura que proporciona.

    r4 := bufio.NewReader(f)
    b4, err := r4.Peek(5)
    check(err)
    fmt.Printf("5 bytes: %s\n", string(b4))

Cierra el archivo cuando hayas terminado (normalmente esto se programaría inmediatamente después de Open (abrir) con defer).

    f.Close()
}
$ echo "hello" > /tmp/dat
$ echo "go" >>   /tmp/dat
$ go run reading-files.go
hello
go
5 bytes: hello
2 bytes @ 6: go
2 bytes @ 6: go
5 bytes: hello

A continuación, veremos cómo escribir archivos.

Siguiente ejemplo: Writing Files.