Для цього можна використовувати 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()).