1.24 Go之数据I/O对象及操作
Go语言实现基本I/O操作的包
Go语言标准库的 bufio 包中,实现了对数据 I/O 接口的缓冲功能
特点:
封装于接口 io.ReadWriter、io.Reader 和 io.Writer 中,并对应创建了 ReadWriter、Reader 或 Writer 对象,在提供缓冲的同时实现了一些文本基本 I/O 操作功能。
Go的数据核心:
接口是Go语言中所有数据结构的核心。
对象介绍
ReadWriter对象
ReadWriter结构定义:
package practice_interface
import "bufio"
/*
ReadWriter结构定义
*/
type ReadWriter struct {
// Read指针
*bufio.Reader
// Writer指针
*bufio.Writer
}
两个指针提供了对数据I/O对象的读写缓冲功能
创建ReadWriter
对象使用函数--->NewReadWriter()
指定Read
或者Writer
创建一个ReadWriter
对象,
ReadWriter 对象将会向底层 io.ReadWriter 接口写入数据,或者从 io.ReadWriter 接口读取数据
func NewReadWriter(r *bufio.Reader, w *bufio.Writer) *ReadWriter {
return nil
}
创建Reader对象
创建Reader
对象的函数:
-
NewReader()
函数 -
NewReaderSize()
函数
NewReader()
函数按照缓冲区默认长度创造Reader
对象。从底层接口读取尽量多的数据进行缓存。
func NewReader(rd io.Reader) *Reader
NewReaderSize()
函数可以自定义缓冲区字节长度。
func NewReaderSize(rd io.Reader, size int) *Reader
操作Reader对象的方法
Read() | 读取数据,并存放到字节切片 p 中。返回已读取的字节数。 |
---|---|
ReadByte() |
读取并返回一个字节,如果没有字节可读,则返回错误信息--->修改调用方法即可 |
ReadBytes() |
读取数据直到遇到第一个分隔符“delim”,并返回读取的字节序列(包括“delim”)。ReadBytes 在读到第一个“delim” 之前出错,它返回已读取的数据和那个错误 |
ReadLine() |
读取一行数据,如果一行太长(超过缓冲区长度),参数 isPrefix 会设置为 true 并且只返回前面的数据,剩余的数据会在以后的调用中返回。 |
ReadRune() |
读取一个 UTF-8 编码的字符,并返回其 Unicode 编码和字节数。如果编码错误,ReadRune 只读取一个字节并返回 unicode.ReplacementChar(U+FFFD) 和长度 1 |
ReadSlice() |
读取数据直到分隔符“delim” 处,并返回读取数据的字节切片,下次读取数据时返回的切片会失效。如果ReadSlice 在查找到“delim” 之前遇到错误,它返回读取的所有数据和那个错误 |
ReadString() |
读取数据直到分隔符“delim”第一次出现,并返回一个包含“delim”的字符串。如果 ReadString 在读取到“delim”前遇到错误,它返回已读字符串和那个错误(通常是 io.EOF)。只有当返回的字符串不以“delim”结尾时,ReadString 才返回非空 err |
UnreadByte() |
取消已读取的最后一个字节(即把字节重新放回读取缓冲区的前部)。只有最近一次读取的单个字节才能取消读取 |
UnreadRune() |
取消读取最后一次读取的 Unicode 字符。如果最后一次读取操作不是 ReadRune,UnreadRune 会返回一个错误(在这方面它比 UnreadByte 更严格,因为 UnreadByte 会取消上次任意读操作的最后一个字节) |
Buffered() |
返回可从缓冲区读出数据的字节数 |
Peek() |
读取指定字节数的数据,这些被读取的数据不会从缓冲区中清除。在下次读取之后,本次返回的字节切片会失效。如果 Peek 返回的字节数不足 n 字节,则会同时返回一个错误说明原因,如果 n 比缓冲区要大,则错误为 ErrBufferFull |
Reader()方法
特点:
最多只调用底层的 io.Reader 一次,所以返回的 n 可能小于 len(p),当字节流结束时,n 为 0,err 为 io. EOF
func (b *Reader) Read(p []byte) (n int, err error)
示例:
package practice_interface
import (
"bufio"
"bytes"
"fmt"
)
func main() {
// 声明字节数组
data := []byte("JunkingBoy")
// 新建newreader对象
re := bytes.NewReader(data)
// 构建readerwriter对象
r := bufio.NewReader(re)
//由于read方法返回的是字节切片长度,所以新建字节切片对象
var buf [128]byte
// 调用reader对象的read方法
n, err := r.Read(buf[:])
fmt.Println(string(buf[:n]), n, err)
}
Writer()方法
方法名和上面的Reader()
方法对应,只是对象变味了Writer()
It's a lonely road!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本