我的Go+语言初体验——使用Go+读写文件经验总结
问题描述:
目录
前言
Go+ 是一门融合工程开发的 Go、数据科学领域的 Python、编程教学领域的 Scratch,以 Python 之形结合 Go 之心,让工程师处理数据不需要学习新的开发语言,让初学者学习编程、开发作品的门槛更低的编程语言。
正文
读文件和写文件是所有编程语言必须支持的基础操作,同样,Go+ 也不例外。Go+ 提供了非常丰富的读文件和写文件的基础库。今天我们就来了解一下这部分内容。
读文件
首先,我们介绍一下 Go+ 读文件的一些常用方法。
os.ReadFile
os.ReadFile 方法是用来读取文件信息最常用的方法,原理是将文件的全部内容都读取到内存中,示例代码如下:
import (
"bufio"
"io"
"os"
)
func check(e error) {
if e != nil {
panic(e)
}
}
// 首先创建一个文件,并向其中写入内容
d1 := []byte("hello\nworld\n")
err := os.WriteFile("/tmp/f1", d1, 0644)
dat, err := os.ReadFile("/tmp/f1")
check(err)
print(string(dat))
执行结果:
hello
world
io.ReadAtLeast
io.ReadAtLeast 方法从文件中读取最少字节数到内存中,示例代码如下:
import (
"bufio"
"io"
"os"
)
func check(e error) {
if e != nil {
panic(e)
}
}
// 首先创建一个文件,并向其中写入内容
d1 := []byte("hello\nworld\n")
err := os.WriteFile("/tmp/f1", d1, 0644)
dat, err := os.ReadFile("/tmp/f1")
check(err)
print(string(dat))
f, err := os.Open("/tmp/f1")
check(err)
// 偏移6个字节
o3, err := f.Seek(6, 0)
check(err)
b3 := make([]byte, 2)
n3, err := io.ReadAtLeast(f, b3, 2)
check(err)
printf("%d bytes @ %d: %s\n", n3, o3, string(b3))
执行结果:
hello
world
2 bytes @ 6: wo
bufio.NewReader
bufio.NewReader 方法是一个缓冲读取器,该读取器对于少量数据的读取非常方便。示例代码如下:
import (
"bufio"
"io"
"os"
)
func check(e error) {
if e != nil {
panic(e)
}
}
// 首先创建一个文件,并向其中写入内容
d1 := []byte("hello\nworld\n")
err := os.WriteFile("/tmp/f1", d1, 0644)
dat, err := os.ReadFile("/tmp/f1")
check(err)
print(string(dat))
f, err := os.Open("/tmp/f1")
check(err)
r4 := bufio.NewReader(f)
b4, err := r4.Peek(5)
check(err)
printf("5 bytes: %s\n", string(b4))
执行结果:
hello
world
5 bytes: hello
写文件
os.WriteFile
首先,我们来看如何将字节数组写入文件,示例代码如下:
import (
"bufio"
"os"
)
func check(e error) {
if e != nil {
panic(e)
}
}
d1 := []byte("hello\nworld\n")
err := os.WriteFile("/tmp/f1", d1, 0644)
check(err)
执行完毕后,没有触发 panic,说明程序执行成功啦。但是不够直观,我们把文件内容读一下再打印出来,进而佐证我们的推断,示例代码:
import (
"bufio"
"os"
)
func check(e error) {
if e != nil {
panic(e)
}
}
d1 := []byte("hello\nworld\n")
err := os.WriteFile("/tmp/f1", d1, 0644)
check(err)
dat, err := os.ReadFile("/tmp/f1")
check(err)
print(string(dat))
执行结果:
hello
world
从执行结果可以知道我们的推断是正确的,程序没有问题。
File.Write
写文件还有一种思路,就是首先创建或者打开一个文件,再向其中写入内容信息,示例代码如下:
import (
"bufio"
"os"
)
func check(e error) {
if e != nil {
panic(e)
}
}
f, err := os.Create("/tmp/f2")
check(err)
// 打开文件后,defer 关闭文件属于常规做法
defer f.Close()
d2 := []byte{1, 222, 66, 88, 10, 102}
n2, err := f.Write(d2)
check(err)
printf("wrote %d bytes\n", n2)
n3, err := f.WriteString("gop is go+\n")
check(err)
printf("wrote %d bytes\n", n3)
// 保证文件内容存入磁盘
f.Sync()
执行结果:
wrote 6 bytes
wrote 11 bytes
bufio.WriteString
bufio 包也提供了缓冲写卡器,可以用来写文件,示例代码如下:
import (
"bufio"
"os"
)
func check(e error) {
if e != nil {
panic(e)
}
}
f, err := os.Create("/tmp/f1")
check(err)
// 打开文件后,defer 关闭文件属于常规做法
defer f.Close()
w := bufio.NewWriter(f)
n4, err := w.WriteString("use bufio package write data\n")
check(err)
printf("wrote %d bytes\n", n4)
// 保证缓存数据生效
w.Flush()
执行结果:
wrote 29 bytes
答
学习到了