bytes, err := ioutil.ReadFile("a.txt")
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
该种方式需要引入ioutil包,ioutil.ReadFile的入参为文件名,返回值分别是文件内容,和错误信息。
第二种方式需要通过os.Open打开文件,然后通过ioutil.ReadAll来读取,如下:
fin, err := os.Open("a.txt")
if err != nil {
panic(err)
}
defer fin.Close()
bytes, err := ioutil.ReadAll(fin)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
第二种方式需要同时引入os包和ioutil包,os.Open入参为文件名,返回值分别是文件句柄和错误信息,ioutil.ReadAll入参为io.Reader,因为File实现了io.Reader接口(File支持Read方法),所以fin可以直接转换为io.Reader,返回值和io.ReadFile相同。
第三种方式同样先使用os.Open打开文件,然后使用File的Read方法读取内容,如下:
fin, err := os.Open("a.txt")
if err != nil {
panic(err)
}
defer fin.Close()
buf := make([]byte, 11)
_, err = fin.Read(buf)
if err != nil {
panic(err)
}
fmt.Println(string(buf))
与前两种方式不同,该种方式需要自己管理内存。该种方式只需引入os包。
第四种方式同样需要先使用os.Open打开文件,然后创建一个bufio.Reader对象,通过bufio.Reader对象去读取内容,如下:
fin, err := os.Open("a.txt")
if err != nil {
panic(err)
}
defer fin.Close()
rd := bufio.NewReader(fin)
buf := make([]byte, 11)
_, err = rd.Read(buf)
if err != nil {
panic(err)
}
fmt.Println(string(buf))
该种方式亦需要自己管理内存。表面上看,该种方式多此一举,但实际并非如此,因为bufio.Reader提供了更丰富的处理方法,如ReadLine,ReadString,ReadBytes等,可以减少开发工作。