Go语言用os包读写文件(附带实例)
Go 语句的内置包 os 实现了系统很多操作指令,其中不得不说文件读写功能。文件读写包括文件创建、写入内容、追加内容、读取内容等功能,文件读写功能都定义在内置包 os 的 file.go 文件中。
示例代码如下:
在示例中分别使用 OpenFile() 创建或打开文件,Write()、WriteString()、WriteAt() 写入数据,Read()、ReadAt() 读取数据,每个函数的功能说明如下:
内置包 os 还定义了函数 Open() 和 Create() 创建或打开文件,它们都是在 OpenFile() 的基础上进行封装的,两者的差异如下:
使用 OpenFile() 创建或打开文件时,可以根据实际需要设置文件读写模式,文件读写模式在内置包 os 中已有定义,如图 1 所示。

图 1 文件读写模式
内置包 os 定义了 8 种文件读写模式,每一种模式都有注释说明,使用多种模式可以通过“|”拼接,例如 os.O_RDWR|os.O_SYNC。
常用的文件读写模式有 O_APPEND、O_RDWR、O_SYNC 和 O_TRUNC,说明如下:
① Write(b []byte) (n int, err error):将字节类型的切片写入文件。
支持写入和续写功能,如果 OpenFile() 设置为 os.O_APPEND,它将会在文本末端写入内容;如果没有设置 os.O_APPEND,则在文本的首行写入内容,首行以下的内容保持不变。
② WriteString(s string) (n int, err error):将字符串类型的数据写入文件。
它与 Write() 的写入方式相同。
③ WriteAt(b []byte, off int64) (n int, err error):在文本中按照偏移量写入数据。
如果 OpenFile() 设置 os.O_APPEND,它将无法写入数据,因为参数 off 的偏移量和 os.O_APPEND 模式存在冲突。WriteAt() 相当于 Write()+Seek() 的功能,Seek() 在文本中根据偏移量找到具体位置,再由 Write() 写入数据。
① Read(b []byte) (n int, err error):将读取数据加载到字节类型的切片中。
② ReadAt(b []byte, off int64) (n int, err error):在文本中按照偏移量读取数据。
Read() 和 ReadAt():将读取的数据存放在字节类型的切片中,但是切片必须定义长度,否则数据无法存放在切片中。由于我们无法得知文本数据的具体长度,因此切片长度必须足够长才能存放数据,如果切片长度小于数据长度,则程序只能存储部分数据,切片长度过长也会浪费资源。
综上所述,内置包 os 实现文件读写的总结如下:
示例代码如下:
package main import ( "fmt" "os" ) func main() { // 定义文本内容 var val = "This is values\n" // 将文本内容转为字节类型的切片 var val_byte = []byte(val) fmt.Printf("values_byte的数据长度:%v\n", len(val_byte)) // 创建或打开文件 // 不能使用Open()和Create(),因为文件读写模式不符合要求 f, _ := os.OpenFile("output.txt", os.O_RDWR|os.O_SYNC, 0) // Write()往文件写入文本内容(字节类型的切片) n1, _ := f.Write(val_byte) fmt.Printf("Write()写入数据的长度:%v\n", n1) // WriteString()往文件写入文本内容(字符串类型) n2, _ := f.WriteString(val) fmt.Printf("WriteString()写入数据的长度:%v\n", n2) // WriteAt()相当于Write()+Seek()的功能 // Seek()是文本内容的偏移量,将写入数据在已有数据的某个位置开始写入 // WriteAt()不支持O_APPEND模式 n3, _ := f.WriteAt(val_byte, 0) fmt.Printf("WriteAt()写入数据的长度:%v\n", n3) // 读取文件,必须为切片定义长度 var valu_byte []byte = make([]byte, 10) // 读取方式一:全内容读取 // vb, _ := f.Read(valu_byte) // 读取方式二:部分内容读取 vb, _ := f.ReadAt(valu_byte, 0) vbs := string(valu_byte) fmt.Printf("ReadAt()读取的是数据长度:%v\n", vb) fmt.Printf("ReadAt()读取的是数据:%v\n", vbs) // 关闭文件 f.Close() }运行上述代码,运行结果为:
values_byte的数据长度:15
Write()写入数据的长度:15
WriteString()写入数据的长度:15
WriteAt()写入数据的长度:15
ReadAt()读取的是数据长度:10
ReadAt()读取的是数据:This is va
在示例中分别使用 OpenFile() 创建或打开文件,Write()、WriteString()、WriteAt() 写入数据,Read()、ReadAt() 读取数据,每个函数的功能说明如下:
1) OpenFile()创建或打开文件
OpenFile(name string, flag int, perm FileMode) (*File,error) 设有 3 个参数和两个返回值:- 参数 flag 是整型,代表文件读写模式;
- 参数 perm 是 FileMode 类型,代表文件权限设置,默认设为 0 或 0666;
- 返回值 File 代表文件创建或打开对象;
- 返回值 error 代表函数的错误信息。
内置包 os 还定义了函数 Open() 和 Create() 创建或打开文件,它们都是在 OpenFile() 的基础上进行封装的,两者的差异如下:
- Open() 仅支持文件读取模式,只能读取数据,无法写入数据。
- Create() 支持文件读写模式,但不支持文件内容续写(即在文件已有内容的情况下添加新的内容)。
使用 OpenFile() 创建或打开文件时,可以根据实际需要设置文件读写模式,文件读写模式在内置包 os 中已有定义,如图 1 所示。

图 1 文件读写模式
内置包 os 定义了 8 种文件读写模式,每一种模式都有注释说明,使用多种模式可以通过“|”拼接,例如 os.O_RDWR|os.O_SYNC。
常用的文件读写模式有 O_APPEND、O_RDWR、O_SYNC 和 O_TRUNC,说明如下:
- O_APPEND 模式支持文件内容续写(即在文件已有内容的情况下添加新的内容);
- O_RDWR 模式同时支持文件读取和写入;
- O_SYNC 模式通过同步方式打开文件,防止并发时对文件的资源争夺;
- O_TRUNC 模式将数据写入文件并且覆盖文件原有数据。
2) Write()、WriteString()、WriteAt()写入数据
在文件中写入数据可以使用函数 Write()、WriteString()、WriteAt() 实现,三者的差异说明如下:① Write(b []byte) (n int, err error):将字节类型的切片写入文件。
- 参数 b 是字节类型的切片,代表需要写入文件的数据;
- 返回值 n 是已写入的数据长度;
- 返回值error是函数执行的错误信息。
支持写入和续写功能,如果 OpenFile() 设置为 os.O_APPEND,它将会在文本末端写入内容;如果没有设置 os.O_APPEND,则在文本的首行写入内容,首行以下的内容保持不变。
② WriteString(s string) (n int, err error):将字符串类型的数据写入文件。
- 参数 s 是字符串类型,代表写入文件的数据;
- 返回值 n 是已写入的数据长度;
- 返回值 error 是函数执行的错误信息。
它与 Write() 的写入方式相同。
③ WriteAt(b []byte, off int64) (n int, err error):在文本中按照偏移量写入数据。
- 参数 b 是字节类型的切片,代表需要写入文件的数据;
- 参数 off 是整型,代表数据的偏移量;
- 返回值 n 是已写入的数据长度;
- 返回值 error 是函数执行的错误信息。
如果 OpenFile() 设置 os.O_APPEND,它将无法写入数据,因为参数 off 的偏移量和 os.O_APPEND 模式存在冲突。WriteAt() 相当于 Write()+Seek() 的功能,Seek() 在文本中根据偏移量找到具体位置,再由 Write() 写入数据。
3) Read()、ReadAt()读取数据
从文件中读取数据可以使用函数 Read()、ReadAt() 实现,两者的差异说明如下:① Read(b []byte) (n int, err error):将读取数据加载到字节类型的切片中。
- 参数 b 是字节类型的切片,用于保存数据;
- 返回值 n 是已读取数据的长度;
- 返回值 error 是函数执行的错误信息。
② ReadAt(b []byte, off int64) (n int, err error):在文本中按照偏移量读取数据。
- 参数 b 是字节类型的切片,用于保存数据;
- 返回值 n 是已读取数据的长度;
- 返回值 error 是函数执行的错误信息。
Read() 和 ReadAt():将读取的数据存放在字节类型的切片中,但是切片必须定义长度,否则数据无法存放在切片中。由于我们无法得知文本数据的具体长度,因此切片长度必须足够长才能存放数据,如果切片长度小于数据长度,则程序只能存储部分数据,切片长度过长也会浪费资源。
综上所述,内置包 os 实现文件读写的总结如下:
- 使用 Open()、Create() 或 OpenFile() 创建或打开文件。Open() 和 Create() 在 OpenFile() 的基础上封装,OpenFile() 能设置文件读写模式和权限,具有较强的灵活性。
- 使用 Write()、WriteString() 或 WriteAt() 写入数据。Write() 和 WriteString() 支持 os.O_APPEN D模式,而 WriteAt() 不支持。
- 使用 Read() 或 ReadAt() 读取数据。数据能否正常读取与字节类型的切片长度相关,如果数据长度大于切片长度,则数据无法完整读取;如果数据长度小于切片长度,则浪费内存空间。若要保证数据和切片长度刚好匹配,则需要调用 os 包的 Stat() 和 Size() 计算文件大小来设置切片长度。