I/O
:输入/输出Input/Output。io包抽象了输入(读)输出(写)原语。而文件操作也是一种io操作。
go语言的io包抽象可以看到一个自底向上逐一抽象的关于IO操作的实现。io包抽象了io相关操作的4个基础接口:
type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) } type Closer interface { Close() error } type Seeker interface { Seek(offset int64, whence int) (int64, error) }
而这4个基础接口利用go语言结构体的组合特性,依次组合出:ReadWriter
、ReadCloser
、WriteCloser
、ReadWriteCloser
、ReadSeeker
、ReadSeekCloser
、WriteSeeker
、ReadWriteSeeker
。当然io包还提供有其他诸如:ReaderFrom
、WriterTo
、ReaderAt
、WriterAt
、ByteReader
、ByteScanner
、ByteWriter
、RuneReader
、RuneScanner
、StringWriter
等接口抽象。
看go语言的io包会发现除了定义了核心抽象接口外还提供了一些上述接口的实现结构体,还提供了一个ioutil
子包,这种混乱是因为历史原因和go官方对go1兼容性的保证导致的,不过1.16开始官方把ioutil
子包这个子包的绝大数功能迁移到了os包以及新增的fs包,更加的统一和层级分明。新项目应该尽量避免使用ioutil
这个子包,使用os或fs包替代即可,查看1.16版的源码会发现很多如下代码:
// ReadFile reads the file named by filename and returns the contents. // A successful call returns err == nil, not err == EOF. Because ReadFile // reads the whole file, it does not treat an EOF from Read as an error // to be reported. // // As of Go 1.16, this function simply calls os.ReadFile. func ReadFile(filename string) ([]byte, error) { return os.ReadFile(filename) }
官方提供的替换方法映射关系如下:
go1.16开始新增了一个文件系统的抽象接口io/fs
包,用于抽象文件系统相关接口。这样也把原先的io、os两个包的边界做了一些隔离。与io包下定义的接口相类似,基础文件系统接口为fs.FS
,以及通过组合扩展的glob文件协议的fs.GlobFS
、遍历处理目录的fs.ReadDirFS
和文件相关操作的fs.ReadFileFS
,还有一个深的linux哲学的用于一些文件本身属性信息的fs.StatFS
。同时还定义了fs.File
这个接口用于操作文件和描述文件的fs.FileInfo
,以及fs.DirEntry
这个接口用于描述和操作目录。
fs.FS
这个接口主要是为了与io包相关接口一样抽象统一文件相关操作。而具体的文件系统相关的操作方法则需要实现这些fs相关的接口。例如os包同时提供了一个os.DirFS
方法返回的就是一个已经实现了fs.FS
接口的文件系统。需要注意的是os包下也有一个os.File
结构体,与fs包下通用抽象的fs.File
接口有巨大差异。
go语言文件操作相关放在os包里。
只读打开文件:func Open(name string) (*File, error)
,查看源码会发现调用的是OpenFile方法;
创建文件:func Create(name string) (file *File, err Error)
,创建的文件权限默认为0666,查看源码会发现调用的是OpenFile方法;若需要自定义权限则需使用OpenFile方法。
指定权限打开文件func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
,这是一个核心基础方法,其中perm权限使用os包提供的常量虽然是一个十六进制数,多个权限取余,这就是linux哲学里掩码的强大为例。
根据文件描述符打开创建文件:func NewFile(fd uintptr, name string) *File
,这个方法比较底层,例如go对标准输出的抽象的变量os.Stdin
就是通过这个方法创建的。
读取文件为比特数组:func ReadFile(name string) ([]byte, error)
,底层封装了Open方法,并处理了os.*File
结构体直接返回文件内容的比特数组。
上述函数调用成功后,即可获得可以具体操作文件内容的os.*File
结构体,这个结构体即可完成文件的具体读操作。
本质是操作os.*File
结构体的方法,例如func (file *File) WriteString(s string) (ret int, err Error)
、func (file *File) WriteAt(b []byte, off int64) (n int, err Error)
等。
当然go也提供了快捷写文件的函数:func WriteFile(name string, data []byte, perm FileMode) error
,底层调用OpenFile可写模式写入指定的比特数组。
linux哲学里一切皆文件,我们传统认为的文件和目录都是操作文件。
文件重命名:func Rename(oldpath, newpath string) error
删除文件:func Remove(name string) error
当然文件操作还是有创建软链、创建目录等等许多方法。
---
参考资料:
① https://golang.google.cn/doc/go1compat
② https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter01/01.1.md
③ https://golang.google.cn/doc/go1.16#ioutil
深圳坪山网站建设公司淮北网站优化报价长沙网站seo优化工具网站优化的优势济南建材行业网站优化推广方案网站怎么优化才能上首页上海专业网站优化公司网站优化平台排名厦门网站建设网站优化新民网站建设优化价格新民网站优化快照赤峰网站自然优化网站优化公司哪家信誉好平台seo网站优化技巧线尚网络网站优化的策略有哪些威海seo网站优化临清市优化网站白城网站排名优化小吃网站优化优化网站搜索桃城区网站seo优化排名安庆企业网站排名优化哪家服务好滦南有实力的网站优化哪家好大连专业seo优化网站费用网站权重优化搜行者SEO健词优化排名网站网站优化怎么修改代码新民网站建设优化价格兰州网站优化哪家合适外贸网站如何做优化小说漫画网站做优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤
哟嚯,本文评论功能关闭啦~