go语言写入文件的六种方式

 阅读大约需要1分钟

go语言写入文件的六种方式

writefile.go代码如下:

package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
)

func main() {
	s := []byte("Data to write\n")
	f1, err := os.Create("f1.txt")
	if err != nil {
		fmt.Println("Cannot create file", err)
		return
	}
	defer f1.Close()
	fmt.Fprintf(f1, string(s))

	f2, err := os.Create("f2.txt")
	if err != nil {
		fmt.Println("Cannot create file", err)
		return
	}
	defer f2.Close()
	n, err := f2.WriteString(string(s))
	fmt.Printf("wrote %d bytes\n", n)

	f3, err := os.Create("f3.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	w := bufio.NewWriter(f3)
	n, err = w.WriteString(string(s))
	fmt.Printf("wrote %d bytes\n", n)
	w.Flush()
	f3.Close()

	f4 := "f4.txt"
	err = ioutil.WriteFile(f4, s, 0644)
	if err != nil {
		fmt.Println(err)
		return
	}

	f5, err := os.Create("f5.txt")
	if err != nil {
		fmt.Println(err)
		return
	}
	n, err = io.WriteString(f5, string(s))
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("wrote %d bytes\n", n)

	f6, err := os.Create("f6.txt")
	if err != nil {
		fmt.Println("Cannot create file", err)
		return
	}
	defer f6.Close()
	n, err = f6.Write(s)
	fmt.Printf("wrote %d bytes\n", n)
}

编译文件

go build writefile.go

执行

./writefile

其中f2.WriteString是把字符串转换成字节数据,之后调用和f6.Write(s)相同的方法。

ioutil.WriteFile(f4, s, 0644)是先打开文件,然后调用和f6.Write(s)相同的方法 写入文件

f5调用了Writer interface的方法,根据调用的结构体来决定取用哪一个实现,当然上面的代码中取用的是File结构体的实现, 所以f2,f5,f6在上述代码中实际调用的方法是同一个。

f3是带缓存的*Writer,是Writer结构体的实现。