围绕 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 读写还要快。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)