go 文件读写有很多方式,这里我们选择ioutil包
把文件读取到内存
package main import ( "io/ioutil" "fmt" ) func main() { data,err := ioutil.ReadFile("a.txt") #这里返回的data是一个字节切片 if err!=nil{ fmt.Println("File reading error", err) } fmt.Println(string(data)) }
讲文件绑定在二进制文件中
packr
会把静态文件(例如 .txt
文件)转换为 .go
文件,接下来,.go
文件会直接嵌入到二进制文件中。packer
非常智能,在开发过程中,可以从磁盘而非二进制文件中获取静态文件。在开发过程中,当仅仅静态文件变化时,可以不必重新编译。
package main import ( "fmt" "github.com/gobuffalo/packr" ) func main() { box := packr.NewBox("../a.txt") data := box.String("test.txt") fmt.Println("Contents of file:", data) }
逐行读取文件
package main import ( "bufio" "flag" "fmt" "log" "os" ) func main() { //fptr := flag.String("fpath", "test.txt", "file path to read from") //flag.Parse() f, err := os.Open(“a.txt”) //因为bufio需要的是一个*os.File类型,所以我们换个方式读取,稍后再介绍一下 if err != nil { log.Fatal(err) } defer func() { if err = f.Close(); err != nil { log.Fatal(err) } }() s := bufio.NewScanner(f) for s.Scan() { fmt.Println(s.Text()) } err = s.Err() if err != nil { log.Fatal(err) } }
分块读取文件
当文件非常大时,尤其在 RAM 存储量不足的情况下,把整个文件都读入内存是没有意义的。更好的方法是分块读取文件。这可以使用 bufio包来完成。
package main import ( "bufio" "flag" "fmt" "log" "os" ) func main() { //fptr := flag.String("fpath", "test.txt", "file path to read from") //flag.Parse() f, err := os.Open("a.txt") if err != nil { log.Fatal(err) } defer func() { if err = f.Close(); err != nil { log.Fatal(err) } }() r := bufio.NewReader(f) b := make([]byte, 3) for { _, err := r.Read(b) if err != nil { fmt.Println("Error reading file:", err) break } fmt.Println(string(b)) } }