Go编程技巧--io.ReaderWriter

Go编程技巧--io.ReaderWriter,第1张

Go 原生的 pkg 中有一些核心的 interface ,其中 ioReader/Writer 是比较常用的接口。很多原生的结构都围绕这个系列的接口展开,在实际的开发过程中,你会发现通过这个接口可以在多种不同的io类型之间进行过渡和转化。本文结合实际场景来总结一番。

围绕 ioReader/Writer ,有几个常用的实现:

这些实现对于初学者来说其实比较难去记忆,在遇到实际问题的时候更是一脸蒙圈,不知如何是好。下面用实际的场景来举例

encoding/base64 包中:

这个用来做 base64 编码,但是仔细观察发现,它需要一个ioWriter作为输出目标,并用返回的 WriteCloser 的Write方法结果写入目标,下面是Go官方文档的例子

这个例子是将结果写入到 Stdout ,如果我们希望得到一个字符串呢?观察上面的图,不然发现可以用bytesBuffer作为目标 ioWriter :

这种场景经常用在基于字节的协议上,比如有一个具有固定长度的结构:

通过一个 []byte 来反序列化得到这个 Protocol ,一种思路是遍历这个 []byte ,然后逐一赋值。其实在 encoding/binary 包中有个方便的方法:

这个方法从一个 ioReader 中读取字节,并已 order 指定的端模式,来给填充 data (data需要是fixed-sized的结构或者类型)。要用到这个方法首先要有一个 ioReader ,从上面的图中不难发现,我们可以这么写:

换句话说,我们将一个 []byte 转成了一个 ioReader 。

反过来,我们需要将 Protocol 序列化得到 []byte ,使用 encoding/binary 包中有个对应的 Write 方法:

通过将 []byte 转成一个 ioWriter 即可:

比如对于常见的基于文本行的 >

あ(a) い(i) う(u) え(e) お(o)

か(ka) き(ki) く(ku) け(ke) こ(ko)

さ(sa) し(shi) す(su) せ(se) そ(so)

た(ta) ち(chi) つ(tsu) て(te) と(to)

な(na) に(ni) ぬ(nu) ね(ne) の(no)

は(ha) ひ(hi) ふ(hu或fu) へ(he) ほ(ho)

ま(ma) み(mi) む(mu) め(me) も(mo)

や(ya) ゆ(yu) よ(yo)

ら(ra) り(ri) る(ru) れ(re) ろ(ro)

わ(wa) を(wo) ん(n)

扩展资料:


罗马音不仅用于日语,韩语也同样受用。韩国地名的英文译名其实就是它们的罗马音。而韩国人名的英语写法其实也是根据韩语本来的发音转化而来的,这种转化是有规律在其中的。

罗马音里的e是汉语拼音的ei,以e结尾的全部要读成“ei”的后半段,还有以n结尾的,比如kon就是汉语拼音里的k eng,依此类推以on结尾就要把on念成eng,还有罗马音的shi在拼音里其实是xi,ti应念成qi,tu念cu,yu是you,最后罗马音里以r开头的都要念l,比如ra就念做la,等等。

参考资料:

百度百科-罗马音

测试文件使用的文件大小为 135GB 的日志文本文件,使用下面两种方式来读取。

Go 标准库中包含了读写的缓冲库,直接使用即可:

输出结果为:

Go 标准库中包括了 io 读写的相关工具包,直接开箱即用:

输出结果为:

结果对比

测试发现, ioutilReadFile 比 bufio 读写还要快。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12945924.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存