go bytes 浅析

go bytes 定义了一些操作 byte slice 的便利操作
package main

import (
    "bytes"
    "fmt"
    "io"
    "os"
)

func handleErr(err error) {
    if err != nil {
        panic(err)
    }
}

func main() {
    s := []byte("hello world")
    // NewReader 返回一个结构体对象地址,这个结构体对象实现了很多方法:
    // Len(),Size(),Read(),ReadAt(),ReadByte()等
    b := bytes.NewReader(s)
    // 返回b中slice未读部分的长度
    fmt.Println("unread size: ", b.Len())
    // 返回b中slice的真实长度
    fmt.Println("real size: ", b.Size())
    a := make([]byte, 10)
    // 将b中的byte读到a中,返回读到的字节数,从b偏移量处(b.Size-b.Len)开始读
    n, err := b.Read(a)
    handleErr(err)
    fmt.Println("read numbers: ", n)
    fmt.Println("a is: ", string(a)) // 因为a大小为10,所以只输出:hello worl
    fmt.Println("len after read: ", b.Len()) // 因为读取了10个byte,所以当前len为1
    fmt.Println("size after read: ", b.Size()) // size仍为11
    f, err := os.OpenFile("./test-file", os.O_WRONLY, os.ModeAppend)
    handleErr(err)
    defer f.Close()
    // 将b中的slice读入文件中,返回读入的字节数
    // 此时b的便宜量指向d,所以只向文件中写入了一个d
    n1, err := b.WriteTo(f)
    handleErr(err)
    fmt.Println("write numbers: ", n1)
    fmt.Println("len after write: ", b.Len()) // 此时len为0
    fmt.Println("size after write: ", b.Size()) // size仍为11
    // 将b中的slice重新赋值
    b.Reset([]byte("reset it."))
    fmt.Println("new b: ", b.Len(), b.Size())
    // 从偏移量处读取一个字节
    w, err := b.ReadByte()
    handleErr(err)
    fmt.Println("ReadByte: ", string(w)) // 输出 r
    // 将b的偏移量设置为当前偏移量+1, 返回设置后的偏移量
    abs, err := b.Seek(1, io.SeekCurrent)
    handleErr(err)
    fmt.Println("after Seek: ", abs) // seek前的偏移量为1,所以输出2
    fmt.Println("before UnreadByte: ", b.Len()) // 输出:7
    // 将偏移量向前移动1位,相当于b.Seek(-1, io.SeekCurrent)
    handleErr(b.UnreadByte())
    fmt.Println("after UnreadByte: ", b.Len()) // 输出:8
    a = make([]byte, 6)
    // 从b的偏移量是3的地方开始,读入到a中
    // 注意:如果n < len(a) 会返回异常:EOF
    n, err = b.ReadAt(a, 3)
    handleErr(err)
    fmt.Println("a after ReadAt: ", string(a)) // 输出:et it.
    b.Reset([]byte("你好吗"))
    // 处理中文
    r, n , err := b.ReadRune()
    handleErr(err)
    fmt.Println("readRune: ", string(r), n) // 输出:你 3
    r, n , err = b.ReadRune()
    fmt.Println("readRune: ", string(r), n) // 输出:好 3
    // 将偏移量向前移动一位
    handleErr(b.UnreadRune())
    r, n , err = b.ReadRune()
    fmt.Println("readRune: ", string(r), n) //输出:好 3
}
发布了14 篇原创文章 · 获赞 1 · 访问量 2918

猜你喜欢

转载自blog.csdn.net/weixin_42450836/article/details/105035439
今日推荐