Golang 中的 io 包详解(四):单字节操作接口

news/2024/11/30 13:35:27/

io.ByteReader

type ByteReader interface {ReadByte() (byte, error)
}

定义了一个基本方法 ReadByte,用于读取数据源中的单个字节,如果没有字节可读,返回非 nil 的错误。

标准库中的 bufio.Reader 实现了该接口,从一个 io.Reader 中读取并提供带缓存的读取方法,简单示例如下:

package mainimport ("bufio""fmt""strings"
)func main() {data := "abc123"reader := bufio.NewReader(strings.NewReader(data))for {c, err := reader.ReadByte()if err != nil {break}fmt.Print(string(c))}
}

io.ByteScanner

type ByteScanner interface {ByteReaderUnreadByte() error
}

是 io.ByteReader 接口的扩展,提供了一个额外的方法:UnreadByte,UnreadByte方法让下一次调用 ReadByte 时返回之前调用 ReadByte 时返回的同一个字节。

io.ByteWriter

// ByteWriter is the interface that wraps the WriteByte method.
type ByteWriter interface {WriteByte(c byte) error
}

定义了一个基本方法 ReadByte,用于向数据源中写入单个字节的能力,

标准库中的 bufio.Writer 实现了该接口,从字节序列中构造并提供缓冲输出,简单示例如下:

package mainimport ("bufio""bytes""fmt"
)func main() {buf := new(bytes.Buffer)writer := bufio.NewWriter(buf)for _, c := range "abc123" {err := writer.WriteByte(byte(c))if err != nil {panic(err)}}writer.Flush()fmt.Println(buf.String())
}

io.RuneReader

type RuneReader interface {ReadRune() (r rune, size int, err error)
}

用于从字符流中读取 Unicode 码点(Rune),定义了一个基本方法 ReadRune,接受一个参数类型为 rune 的指针,并返回读取的 Rune 以及错误类型。

io.RuneReader 通常与 bufio.Reader 一起使用,用于构建高效的文本读取器。例如如下示例,使用 bufio.Reader 读取一个文件并逐行解析其中的 Unicode 码点:

package mainimport ("bufio""fmt""io""log""os"
)func main() {file, _ := os.Open("file.txt")defer file.Close()reader := bufio.NewReader(file)for {r, _, err := reader.ReadRune()if err != nil {if err == io.EOF {break}log.Fatal(err)}if r == '\n' {fmt.Println()} else {fmt.Print(r)}}
}

io.RuneScanner

type RuneScanner interface {RuneReaderUnreadRune() error
}

扩展了 io.RuneReader 接口,添加了一个名为 UnreadRune 的方法,用于撤消最近读取的 Rune,并使下一次读取的时候再次返回该 Rune。简单示例如下:

package mainimport ("bufio""fmt""io""log""os""strings"
)func main() {scanner := bufio.NewScanner(os.Stdin)for {if ok := scanner.Scan(); !ok {break}str := scanner.Text()reader := strings.NewReader(str)for {runeScanner := bufio.NewReader(reader)r, _, err := runeScanner.ReadRune()if err != nil {if err == io.EOF {break}log.Fatal(err)}fmt.Printf("%#U\n", r)}}
}

使用 bufio.Scanner 从控制台读取每一行输入,然后将每一行转换为一个 strings.Reader,并将其传递给 bufio.NewReader 来扫描 Rune。

io.StringWriter

// StringWriter is the interface that wraps the WriteString method.
type StringWriter interface {WriteString(s string) (n int, err error)
}

定义了一个基本方法 WriteString,用来将数据写入一个字符串。简单示例如下:

package mainimport ("fmt""io""strings"
)func main() {var builder strings.Builderwriter := io.StringWriter(&builder)writer.WriteString("Hello, ")writer.WriteString("World!")result := builder.String()fmt.Println(result) // 输出:Hello, World!
}

首先创建了一个 strings.Builder,然后使用 io.StringWriter 将 builder 转换为一个 io.Writer,最后使用 builder.String 将最终结果转换为一个 string。


http://www.ppmy.cn/news/285104.html

相关文章

数据结构4:二叉树

目录 1.树概念及结构 1.1树的概念 1.3树的表示 1.4树在实际中的运用(表示文件系统的目录结构) 2.二叉树的概念及结构 2.1概念 2.2现实中的二叉树: 2.3特殊的二叉树: 2.4 二叉树的性质 2.5二叉树的存储结构 1.顺序结构 …

Unity:鼠标【上下左右滑动时】控制相机【左右张望】和【上下抬头】

相机旋转,看着是小事,但是却关系到用户的直观体验。旋转对了母慈子孝,旋转错了则翻江倒海。 一、功能 鼠标左右移动时,控制相机左右转动 鼠标上下移动时,控制相机抬头低头 二、被GPT带翻的过程 你可以在GPT里提问&…

架构师要顺应技术的生命周期

在架构设计的过程中,架构师会有一个相对确定的商业和技术选择空间。在这个选择的空间内,架构师做技术选型的时候,必须要考虑到所依赖的商业和技术模块的生命周期。这个时候,我们就需要看准技术趋势,选择已经有规模优势…

罗技M590优联无法使用的问题解决

罗技M590优联无法使用的问题解决 - 知乎 (zhihu.com) ↑大多数人可参考,但我的情况解决不了 刚开始直接插USB使用优联模式没问题,但是设置了蓝牙连接模式后,优联模式失效。 我是遇到了文章内也就是第一个↑这个问题。 然后呢还没检测到我的…

罗技压枪脚本教学(二)

虽然用于游戏不是好东西,但是还是想分享下 前景提示: 发现上次写的已经失效了本文纯属教学,仅涉及初步内容,也不接单 上个脚本没想到两年就过气了,貌似老的LGS还可以用,新的GHUB就不行了,大人…

罗技无线键盘linux,罗技发布旗下第一款无线机械游戏键盘 G613

罗技的机械键盘自 G710 以来已经出了这么多把,唯一众所期待,但罗技就是不推出的,恐怕就是无线的机械键盘了。如今罗技不仅终于满足了我们小小的愿望,而且还顺便补上了六颗 G 键呢。G613 和 G610 / G810 外型相似,但因为…

罗技 连点 脚本_罗技G宣布与《英雄联盟》合作 推出一系列游戏周边产品

10 月 30 日消息 昨天,罗技旗下游戏外设品牌罗技 G 宣布与《英雄联盟》的创作者拳头游戏正式开启为期多年的独家合作。作为合作内容的一部分,罗技 G 将推出一系列官方授权的《英雄联盟》游戏周边产品,其中首款合作产品的灵感来自于在 2020 年…

【2022最新罗技G502吃鸡宏】

罗技G502吃鸡宏 function.sh function.sh ---------------- Basic Variable ----------------------------- ---------------- Do not edit ---------------------local current_weapon "none"---------------- 基本设…