คุณสามารถใช้os.File (ซึ่งใช้อินเทอร์เฟซio.Reader ) กับไฟล์ bufioแพ็คเกจสำหรับสิ่งนั้น อย่างไรก็ตามแพ็กเกจเหล่านั้นสร้างขึ้นโดยคำนึงถึงการใช้หน่วยความจำคงที่ (ไม่ว่าไฟล์จะมีขนาดใหญ่แค่ไหน) และค่อนข้างเร็ว
น่าเสียดายที่ทำให้การอ่านไฟล์ทั้งหมดลงในหน่วยความจำซับซ้อนขึ้นเล็กน้อย คุณสามารถใช้ไบต์บัฟเฟอร์เพื่อรวมส่วนต่างๆของบรรทัดหากเกินขีด จำกัด ของบรรทัด อย่างไรก็ตามฉันขอแนะนำให้คุณลองใช้โปรแกรมอ่านบรรทัดโดยตรงในโครงการของคุณ (โดยเฉพาะอย่างยิ่งหากไม่ทราบว่าไฟล์ข้อความมีขนาดใหญ่แค่ไหน!) แต่ถ้าไฟล์มีขนาดเล็กตัวอย่างต่อไปนี้อาจเพียงพอสำหรับคุณ:
package main
import (
"os"
"bufio"
"bytes"
"fmt"
)
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()
)