Bunun için bufio paketi ile os.File'ı ( io.Reader arayüzünü uygulayan ) kullanabilirsiniz. Ancak, bu paketler sabit bellek kullanımı göz önünde bulundurularak (dosya ne kadar büyük olursa olsun) oluşturulmuştur ve oldukça hızlıdır.
Ne yazık ki bu, tüm dosyanın belleğe okunmasını biraz daha karmaşık hale getirir. Satır sınırını aşmaları halinde, satırın bölümlerini birleştirmek için bir bytes.Buffer kullanabilirsiniz . Her neyse, satır okuyucuyu doğrudan projenizde kullanmayı denemenizi tavsiye ederim (özellikle metin dosyasının ne kadar büyük olduğunu bilmiyorsanız!). Ancak dosya küçükse, aşağıdaki örnek sizin için yeterli olabilir:
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)
}
}
Diğer bir alternatif , dosyanın tamamını bir defada okumak için io.ioutil.ReadAll kullanmak ve daha sonra dilimlemeyi satır satır yapmak olabilir. Size satırları dosyaya nasıl geri yazacağınıza dair açık bir örnek vermiyorum, ancak bu temelde os.Create()
örnektekine benzer bir döngü tarafından izlenen bir döngüdür (bakınız main()
).