Você pode usar os.File (que implementa a interface io.Reader ) com o pacote bufio para isso. No entanto, esses pacotes são construídos com o uso de memória fixa em mente (não importa o tamanho do arquivo) e são bastante rápidos.
Infelizmente, isso torna a leitura de todo o arquivo na memória um pouco mais complicada. Você pode usar um bytes.Buffer para juntar as partes da linha se elas excederem o limite da linha. De qualquer forma, recomendo que você tente usar o leitor de linha diretamente no seu projeto (principalmente se não souber o tamanho do arquivo texto!). Mas se o arquivo for pequeno, o exemplo a seguir pode ser suficiente para você:
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)
}
}
Outra alternativa pode ser usar io.ioutil.ReadAll para ler o arquivo completo de uma vez e depois fazer o corte por linha. Não dou um exemplo explícito de como escrever as linhas de volta no arquivo, mas isso é basicamente os.Create()seguido por um loop semelhante ao do exemplo (consulte Recursos main()).