Go语言文件操作本文主要介绍了Go语言中文件读写的相关操作 。
文件是什么?
计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件 。
os.Open() 函数能够打开一个文件 , 返回一个 *File 和一个 err。对得到的文件实例调用 close() 方法能够关闭文件 。
为了防止文件忘记关闭,我们通常使用defer注册文件关闭语句 。
Read方法定义如下:
它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回 0 和 io.EOF。举个例子:
使用for循环读取文件中的所有数据 。
bufio是在file的基础上封装了一层API,支持更多的功能 。
io/ioutil 包的 ReadFile 方法能够读取完整的文件,只需要将文件名作为参数传入 。
os.OpenFile() 函数能够以指定模式打开文件,从而实现文件写入相关功能 。
其中:
name :要打开的文件名flag :打开文件的模式 。模式有以下几种:
perm :文件权限,一个八进制数 。r(读)04,w(写)02,x(执行)01 。
go语言 ioutil.ReadFile 与ioutil.ReadAll差别 ?? 当读取91.2 MB文件时go语言按字节读取文件,read1耗时43msgo语言按字节读取文件,read2耗时99ms 。
查看源码:
读取文件主要是通过 Read(p []byte) (n int, err error) :
官方文档中关于该接口方法go语言按字节读取文件的说明:
结论:
??ReadFile(filename string)方法之所以速度快的原因就是先计算出file文件的sizego语言按字节读取文件,在初始化对应size大小的buff,传入ReadRead(p []byte) 来读取字节流
golang net/http包 http请求的字节码读取与解析 。先配置Header最长读取时间、req最长读取时间、req最大读取长度默认6M 。
RFC7230禁止\r\n参数go语言按字节读取文件,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符 。但go net/http包放宽了这个要求 。
先构建newTextprotoReader,由于缓冲区是对象复用go语言按字节读取文件的,用完后要defer put 。共完以以下解析任务:
TextprotoReader数据结构 , 将字节码Reader转成文本Reader 。
第一步,从第一行解析出method uri prototype 。
第二步解析URL 。url.URL数据结构:
解析Scheme,协议前缀(小写) 。有查询参数? , 则配置url.ForceQuery url.RawQuery 。有认证信息///...//,则解析url.User url.Host 。最后配置url.Path和url.RawPath,如果Path==RawPath,则RawPath="" 。
第三步解析MIMEHeader 。
第四步readTransfer 。重新配置如下参数:RequestMethod ProtoMajor ProtoMinor Header Trailer ContentLength Close 。对于Body,如果encodings支持chunked , 读取流用chunkedReader包裹 。默认情况用LimitedReader,无body赋空的struct{} 。
以下情况返回非空err,示得到正确的请求:
最后配置req.ctx req.RemoteAddr req.TLS body.doEarlyClose = true 。
构建Response:
其中closeNotifyCh必须在构建时初始化,没有content所以先置contentLength为-1 。
配置w.cw并被w.w包裹 。w.cw缓冲默认大小2M 。
获取Request可能出现如下错误:
先上响应数据结构:
response字段可以分类为:大对象、缓冲、KV对或bool型的状态参数 。
大对象有:
状态字段:
chunkWriter数据结构:
chunkWriter包裹了Response , 功能之一是完成Header设置,包括Content-TypeContent-Length chunk-header 。bufio.Writer是chunkWriter是缓冲包裹 。
handler将响应写入到response.w 。
调用w.w.Flush()将w写入到cw,注意到Flush()操作,如果未刷空缓存并报错,触发拷贝操作 。报错不会退回已写出的数据 。
推荐阅读
- 快手为什么不插卡就能直播,为什么快手上没有开通直播
- 什么是引脚cpu,什么是引脚极性
- 图书馆下载,废弃图书馆下载
- 新媒体 如何+1481822Z空间,如何创造走心的新媒体内容
- python修改函数名 python函数内修改函数的参数
- 微信直播个人创业防骗主播,微信做直播争钱吗
- GO程序设计语言有声书 go程序语言设计pdf
- linux退出连接命令,linux退出x
- 实训一linux基本命令,实训2 linux基本命令