第九天:golang学习笔记之bufio

Macmillan_ · · 600 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

★bufio | bufio 包实现了带缓存的I/O操作.

golang界里我老八,今天给大家看个bufio。bufio包实现了带缓存的I/O,把io.Reader或io.Writer封装成更牛逼的对象

bufio

bufio包内没有接口定义,只有结构体:

1. bufio.Reader

内部全私有变量,通过如下方法创建:
- NewReader(rd io.Reader) *Reader:调用NewReaderSize创建defaultBufSize大小(4096B)的bufReader
- NewReaderSize(rd io.Reader, size int) *Reader
结构体定义如下:

type Reader struct {
    buf          []byte
    rd           io.Reader // reader provided by the client
    r, w         int       // buf read and write positions
    err          error
    lastByte     int // last byte read for UnreadByte; -1 means invalid
    lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid
}

感觉和io.SectionReader比较像,只是bufio.Reader自带缓存。
bufio.Reader实现的方法有,有读取为类型,写至,还有seek操作比如Peek(获取下n个字节),Discard(跳过n个字节),UnreadByte(指针回溯)。

2. bufio.Writer

和bufio.Reader尿性一样,就不看了,用到再说

3. bufio.Scaner

作用是用一个SplitFunc函数(默认为ScanLines)从r中读数据。有个成员叫token,作用为储存通过split函数返回的最后一个片段(可能叫fragment更好点吧?
看一下splitFunc函数的一个实现ScanLine:

func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) {
    if atEOF && len(data) == 0 {
        return 0, nil, nil
    }
    if i := bytes.IndexByte(data, '\n'); i >= 0 {
        // We have a full newline-terminated line.
        return i + 1, dropCR(data[0:i]), nil
    }
    // If we're at EOF, we have a final, non-terminated line. Return it.
    if atEOF {
        return len(data), dropCR(data), nil
    }
    // Request more data.
    return 0, nil, nil
}
  • data:指定的buf区,说白了就是有数据的一个数组,在Scan()里是这么调用的:advance, token, err := s.split(s.buf[s.start:s.end], s.err != nil)
  • atEOF:是否读到字节流尾部
  • advance:游标推进的大小,在(s *Scanner) advance(n int) bool被使用这个函数作用是判断advance是否合法并且前进游标
  • token:读到的字节数组
  • err:错误
    函数寻找'\n'的位置,然后返回包括\n的长度即游标推进值,但返回token数组不包括'\n'
  1. bufio.ReadWriter
    在代码中同时存在bufio.Reader和bufio.Writer时可以发动魔法卡融合
type ReadWriter struct {
    *Reader
    *Writer
}

可以把数据从Reader WriteTo 到 Writer中,也可以让Writer ReadFrom Reader。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Macmillan_

查看原文:第九天:golang学习笔记之bufio

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

600 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传