Bạn có thể sử dụng os.File (triển khai giao diện io.Reader ) với gói bufio cho việc đó. Tuy nhiên, các gói đó được xây dựng với lưu ý đến việc sử dụng bộ nhớ cố định (bất kể tệp có dung lượng lớn như thế nào) và khá nhanh.
Thật không may, điều này làm cho việc đọc toàn bộ tệp vào bộ nhớ phức tạp hơn một chút. Bạn có thể sử dụng bộ đệm byte để nối các phần của dòng nếu chúng vượt quá giới hạn dòng. Dù sao, tôi khuyên bạn nên thử sử dụng trình đọc dòng trực tiếp trong dự án của bạn (đặc biệt nếu bạn không biết tệp văn bản lớn như thế nào!). Nhưng nếu tệp nhỏ, ví dụ sau có thể đủ cho bạn:
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)
}
}
Một giải pháp thay thế khác có thể là sử dụng io.ioutil.ReadAll để đọc toàn bộ tệp cùng một lúc và thực hiện cắt từng dòng sau đó. Tôi không cung cấp cho bạn một ví dụ rõ ràng về cách ghi các dòng trở lại tệp, nhưng về cơ bản os.Create()
đó là một vòng lặp được theo sau bởi một vòng lặp tương tự như trong ví dụ (xem main()
).