Puede usar os.File (que implementa la interfaz io.Reader ) con el paquete bufio para eso. Sin embargo, esos paquetes se crean teniendo en cuenta el uso de memoria fijo (sin importar qué tan grande sea el archivo) y son bastante rápidos.
Desafortunadamente, esto hace que leer todo el archivo en la memoria sea un poco más complicado. Puede usar bytes.Buffer para unir las partes de la línea si exceden el límite de la línea. De todos modos, te recomiendo que pruebes a usar el lector de líneas directamente en tu proyecto (¡especialmente si no sabes qué tan grande es el archivo de texto!). Pero si el archivo es pequeño, el siguiente ejemplo puede ser suficiente para ti:
package main
import (
"os"
"bufio"
"bytes"
"fmt"
)
// Read a whole file into the memory and store it as array of lines
func readLines(path string) (lines []string, err os.Error) {
var (
file *os.File
part []byte
prefix bool
)
if file, err = os.Open(path); err != nil {
return
}
reader := bufio.NewReader(file)
buffer := bytes.NewBuffer(make([]byte, 1024))
for {
if part, prefix, err = reader.ReadLine(); err != nil {
break
}
buffer.Write(part)
if !prefix {
lines = append(lines, buffer.String())
buffer.Reset()
}
}
if err == os.EOF {
err = nil
}
return
}
func main() {
lines, err := readLines("foo.txt")
if err != nil {
fmt.Println("Error: %s\n", err)
return
}
for _, line := range lines {
fmt.Println(line)
}
}
Otra alternativa podría ser usar io.ioutil.ReadAll para leer el archivo completo de una vez y luego hacer el corte por línea. No le doy un ejemplo explícito de cómo volver a escribir las líneas en el archivo, pero es básicamente un os.Create()
ciclo seguido de un bucle similar al del ejemplo (ver main()
).