Go语言文件开关及读写操作示例
作者:梦想橡皮擦 发布时间:2023-08-05 19:47:27
⛳️ 实战场景
本篇博客为大家再次带来 Go 语言的基础知识,这次要学习的内容是 Go 中的文件操作。
打开关闭文件
在 Go 中操作文件,首先要做的就是导入 os 模块,该模块中具备相关函数定义。
package main
import (
"fmt"
"os"
)
func main() {
// 打开文件
file, err := os.Open("./ca.txt")
if err != nil {
fmt.Println("文件打开失败", err)
return
}
print(file) // 输出地址 0xc000006028
// 关闭文件
file.Close()
}
如果文件打开失败,直接展示错误信息,正确的话,会返回 file 对象的地址。
读取文件
使用 Read 函数读取文件,其定义如下所示:
func (f *File) Read(b [] byte)(n int,err error)
从定义中可以发现,Read 函数会返回 2 个值,第一个是读取的字节数,第二个是当读取报错时,返回错误信息,示例代码如下所示:
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 打开文件
file, err := os.Open("./ca.txt")
if err != nil {
fmt.Println("打开文件失败,错误信息:", err)
return
}
// 为了防止忘记关闭文件,可使用defer注册文件关闭语句
defer file.Close()
// Read方法读取数据
var tmp = make([]byte, 128)
// 读取文件
n, err := file.Read(tmp)
// 碰到 io.EOF 表示文件读取到末尾
if err == io.EOF {
fmt.Println("文件读取完毕")
return
}
if err != nil {
fmt.Println("读取文件失败,错误信息:", err)
return
}
fmt.Printf("读取了 %d 字节数据\n", n)
fmt.Println(string(tmp[:n]))
}
输出如下内容:
读取了 24 字节数据
姓名:梦想橡皮擦
读取到 24 个字节,标准的中文占 3 个字节。
但是上述代码最大的问题就是,我们给变量 tmp,即数组 tmp 仅设置了 128 字节,如果待读取的文件超过了改值,例如 txt 内容如下所示:
姓名:梦想橡皮擦1
姓名:梦想橡皮擦2
姓名:梦想橡皮擦3
姓名:梦想橡皮擦4
姓名:梦想橡皮擦5
此时运行代码,就会发现 Read
函数读取到第 128 个字节的时候,就会停止读取,间接导致读取到的数据乱码。
读取了 128 字节数据
姓名:梦想橡皮擦1
姓名:梦想橡皮擦2
姓名:梦想橡皮擦3
姓名:梦想橡皮擦4
姓名:梦想橡��
解决该问题,需要用到 for 循环读取文件数据,代码如下:
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 打开文件
file, err := os.Open("./ca.txt")
if err != nil {
fmt.Println("打开文件失败,错误信息:", err)
return
}
defer file.Close()
// 声明一个 content 切片
var content []byte
var tmp = make([]byte, 128)
for {
n, err := file.Read(tmp)
if err == io.EOF {
fmt.Println("文件读取完毕")
break
}
if err != nil {
fmt.Println("读取文件失败,错误信息:", err)
return
}
// 追加数据
content = append(content, tmp[:n]...)
}
fmt.Println(string(content))
}
上述代码声明了一个动态数组,即切片,解决了读取数据不足的问题。
bufio 读取文件
该函数可以一次读取一行数据,示例代码如下:
func main() {
file, err := os.Open("./ca.txt")
if err != nil {
fmt.Println("打开文件失败,错误信息:", err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
// 逐行读取数据
line, err := reader.ReadString('\n')
if err == io.EOF {
if len(line) != 0 {
fmt.Println(line)
}
fmt.Println("文件读取完毕")
break
}
if err != nil {
fmt.Println("读取文件失败,错误信息:", err)
return
}
fmt.Print(line)
}
}
该函数与 Python 中的 readline
具备同样的效果,接下来演示一下读取整个文件,代码如下:
package main
import (
"fmt"
"io/ioutil"
)
func main() {
content, err := ioutil.ReadFile("./ca.txt")
if err != nil {
fmt.Println("打开文件失败,错误信息:", err)
return
}
fmt.Println(string(content))
}
注意导入模块的时候,直接导入了 io
包中的 ioutil
函数。
写文件
使用 os.OpenFile()
函数可以指定模式打开文件,即可以写入的方式打开文件。
写入文件最常用的函数是 Write
和 WriteString
,示例代码如下所示:
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.OpenFile("ca.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
if err != nil {
fmt.Println("打开文件失败,错误信息:", err)
return
}
defer file.Close()
name := "橡皮擦"
file.Write([]byte(name)) //写入字节切片
file.WriteString("梦想橡皮擦") //写入字符串
}
使用该方式写入文件,会覆盖之前的文件内容,查看结果可直接打开目录下的 ca.txt
进行查看。
我们将 os.OpenFile("ca.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) 中的参数进行单独的说明。
第一个参数表示文件名,第二个参数是打开文件的模式,具体模式如下所示:
os.O_WRONLY
:只写;
os.O_CREATE
:创建文件;
os.O_RDONLY
:只读;
os.O_RDWR
:读写;
os.O_TRUNC
:清空;
os.O_APPEND
:追加。
可以看到与 Python 中的文件模式基本一致。
最后一个参数值 0666
表示文件权限(八进制),这与 linux 文件权限数字一致,读 r
等于 4(感谢博友指出该错误),写 w
表示 2,执行 x
等于 1,所以 666 表示的是文件可读,可写。
在文件写入部分,还存在 bufio.NewWriter
整行写入,ioutil.WriteFile
整体写入等内容,可以学习的时候重点查阅一下。
来源:https://juejin.cn/post/7126451361452916744


猜你喜欢
- //比较数组是否相同 modeler.compArray=function(array1,array2) { &nb
- if 结构if 结构允许程序做出选择,并根据不同的情况执行不同的操作基本用法比较运算符根据 PEP 8 标准,比较运算符两侧应该各有一个空格
- Pytorch提取模型特征向量# -*- coding: utf-8 -*-"""dj""
- 产生跨域问题的原因跨域问题是浏览器同源策略限制,当前域名的js只能读取同域下的窗口属性。跨域问题产生的场景当要在在页面中使用js获取其他网站
- CSS换肤技术一直是一个比较热门的话题,通过给HTML文档不同的CSS样式应用,实现完全不同或风格迥异的页面效果。这样的技术一直为大家所津津
- 等了好久的小程序,终于在近日曝光了。现在就带大家来尝尝鲜。以下是一张随便看看的图。一、构建微信小程序的步骤下载开发工具考虑到微信0.9.09
- 目录 一个简单的实现使用BSF(宽度优先搜索)进行实现使用DFA(Deterministic Finite Automaton)进
- 摘要:下文讲述五种运行sql脚本的方法,如下所示:实验环境:sql server 2008 R2在一次会议讨论中,大家咨询我使用SSMS运行
- 在SQL Server数据库中,有min server memory与max server memory两个内存选项。数据库管理员合理设置这
- composer更新依赖包compoesr 的 require/update 都可以更新指定的依赖包 (升级 / 降级)。require 更
- 先看一个例子:<?phpclass A{ public $b; public $c; public function A() { &n
- 对于php开发小白来说搭建一个php运行环境就是一道坎!因为要做php开发,搭建一个能够运行php网站的服务器环境是第一步,传统的php环境
- 应用场景在数据表中,要记录的每条数据是什么时候创建的,不需要应用程序去特意记录,而是由数据库获取当前时间自动记录创建时间。在数据库中,要记录
- 问题描述:使用scn号恢复误删数据1.查询系统闪回的scn值以及当前日志的scn值,因为我这个是测试,创建的表是在在后边,所以scn值要大于
- 问题一: 在anconda里面如何创建新的python环境(也就是更换新的python版本)1.先打开anconda软件,创建需要的环境2.
- 本文实例为大家分享了Django文件上传与下载的具体代码,供大家参考,具体内容如下文件上传1.新建django项目,创建应用stu: pyt
- 假设我们有一个容器container如下: <style type=”text/css”> #container{width:a
- 导语暗恋让人受尽委屈!一开始,你是我的秘密,我怕你知道,又怕你不知道,又怕你知道装作不知道!这大概就是暗恋的感受吧,可若是双向奔赴,那简更是
- 正在看的ORACLE教程是:ORACLE8的分区管理。摘要:本篇文章介绍了ORACLE数据库的新特性—分区管理,并用例子说明使用方法。 关键
- 本文以实例分析了Python中asyncore模块的原理及用法,分享给大家供大家参考。具体分析如下:asyncore库是python的一个标