Вы можете использовать os.File (который реализует интерфейс io.Reader ) с bufio пакетом . Однако эти пакеты создаются с учетом фиксированного использования памяти (независимо от размера файла) и работают довольно быстро.
К сожалению, это немного усложняет чтение всего файла в память. Вы можете использовать bytes.Buffer для соединения частей строки, если они превышают лимит строки. В любом случае, я рекомендую вам попробовать использовать программу чтения строк прямо в вашем проекте (особенно, если вы не знаете, насколько велик текстовый файл!). Но если файл небольшой, вам может быть достаточно следующего примера:
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)
}
}
Другой альтернативой может быть использование io.ioutil.ReadAll для одновременного чтения всего файла и последующего выполнения нарезки по строкам. Я не даю вам явного примера того, как записывать строки обратно в файл, но это в основномos.Create()
ним следует цикл, аналогичный тому, что в примере (см. main()
).