随笔 - 241  文章 - 1  评论 - 58  阅读 - 85万 

前言

 本文主要介绍了Go语言中文件读写的相关操作。

文件是什么?

计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件。

 Go中所有跟文件相关操作都使用OS这个模块来实现。

 

打开关闭文件

os.Open(path)函数能够打开一个文件返回1个文件句柄,从而实现文件读取相关功能。   

返回一个*File(文件类型的指针)和一个err(错误)

对得到的文件实例调用close()方法对文件进行关闭。

复制代码
//打开和关闭文件
func main() {
    file,err:=os.Open("./test.txt")
    if err!=nil{
        fmt.Println("open file faild",err)
    }
    file.Close()

}
复制代码

 

文件读取

在golang中读取文件有3种方式

1.文件句柄.Read()
 
func (f *File) Read(b []byte) (n int, err error) {.....}

接收一个字节切片,返回 读取的字节数、错误,读到文件末尾时会返回0io.EOF(end of file)

 

乱码

Golang的字符串是由Utf-8编码之后的字节序列,所以不能修改,1个汉字占用3个字节、1个英文字母占用1个字节的存储空间

go使用rune(1个int32类型的数字) 表示中文字符,使用byte(1个uint8类型的数字)表示英文。

我们从1个大文件中读取英文是没有问题的,如果读取汉字1次读取128个字节,有时候会出现把1个中文给拆分成2份,就会出现乱码。

 

2.bufio读取文件

 bufio可以支持我们的程序从缓存中读取文件。bufio返回的文件句柄支持ReadString(‘\n’)以字符串的形式逐行读取。

 
bufio.NewReader()源码启示

bufio.NewReade( )既可以接收fileObj,也可以获取os.Stdin屏幕输入。
bufio.NewReader() 参数为接口类型
只要实现了Read()方法,都可以被传进去!

  

3.ioutill打开文件

ioutill直接读取整个文件,不需要处理IO EOF错误。

 

Linux文件权限设计思想启示

Linux文件权限为什么使用 4、2、1代表 读、写、执行权限?
因为4/2/1这3个数字中任意2个十进制数字相加的的结果正好=它们转换成2进制相与(|)的结果 

根据Linux系统这种文件权限设计思想,也可以做自己web开发中RBAC权限。

 

 

文件写入操作

os.OpenFile()函数能够以指定模式打开1个文件,返回1个文件句柄,从而实现文件写入相关功能。

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
    ...
}

name:要打开的文件名 flag:打开文件的模式。 模式有以下几种:

模式含义
os.O_WRONLY 只写
os.O_CREATE 创建文件
os.O_RDONLY 只读
os.O_RDWR 读写
os.O_TRUNC 清空
os.O_APPEND 追加

perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。

 

1.Write和WriteString

  

2.bufio.NewWriter

bufio是先把文件内容写到缓冲区中,然后flush到硬盘。

  

 3.ioutil.WriteFile

 
插入内容
fileObj.Seek(set int64, whence int)
Seek sets the offset for the next Read or Write on file to offset, interpreted   给要偏移的文件设置1个读写文件的开端。
according to whence:               whence参数
0: means relative to the origin of the file,                  文件源头
1: means  relative to the current offset, and               当前
2 means relative to the end.                                          结束
It returns the new offset and an error, if any. The behavior of Seek on a file opened with O_APPEND is not specified.
如果有个有 新的offset开端或者错误它会返回。以O_APPEND模式打开文件,seek的将会不准确。
 
插入覆盖
使用seek是偏移到文件的某个位置,然后开始写,但是覆盖了原来的内容

 

文件中插入内容

  

 

日志库

用户可以指定日志级别:debug、infro、error 

支持用户格式化输出日志内容到stdout

支持用户格式化输出日志内容写入到文件,且可以指定日志文件切割时间。

github地址

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考

posted on   Martin8866  阅读(640)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示