Golang 中的 IO 包詳解:單字節(jié)操作接口
io.ByteReader
type ByteReader interface {
ReadByte() (byte, error)
}
定義了一個(gè)基本方法 ReadByte,用于讀取數(shù)據(jù)源中的單個(gè)字節(jié),如果沒有字節(jié)可讀,返回非 nil 的錯(cuò)誤。
標(biāo)準(zhǔn)庫中的 bufio.Reader 實(shí)現(xiàn)了該接口,從一個(gè) io.Reader 中讀取并提供帶緩存的讀取方法,簡單示例如下:
package main
import (
"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 {
ByteReader
UnreadByte() error
}
是 io.ByteReader 接口的擴(kuò)展,提供了一個(gè)額外的方法:UnreadByte,UnreadByte方法讓下一次調(diào)用 ReadByte 時(shí)返回之前調(diào)用 ReadByte 時(shí)返回的同一個(gè)字節(jié)。
io.ByteWriter
// ByteWriter is the interface that wraps the WriteByte method.
type ByteWriter interface {
WriteByte(c byte) error
}
定義了一個(gè)基本方法 ReadByte,用于向數(shù)據(jù)源中寫入單個(gè)字節(jié)的能力,
標(biāo)準(zhǔn)庫中的 bufio.Writer 實(shí)現(xiàn)了該接口,從字節(jié)序列中構(gòu)造并提供緩沖輸出,簡單示例如下:
package main
import (
"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 碼點(diǎn)(Rune),定義了一個(gè)基本方法 ReadRune,接受一個(gè)參數(shù)類型為 rune 的指針,并返回讀取的 Rune 以及錯(cuò)誤類型。
io.RuneReader 通常與 bufio.Reader 一起使用,用于構(gòu)建高效的文本讀取器。例如如下示例,使用 bufio.Reader 讀取一個(gè)文件并逐行解析其中的 Unicode 碼點(diǎn):
package main
import (
"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 {
RuneReader
UnreadRune() error
}
擴(kuò)展了 io.RuneReader 接口,添加了一個(gè)名為 UnreadRune 的方法,用于撤消最近讀取的 Rune,并使下一次讀取的時(shí)候再次返回該 Rune。簡單示例如下:
package main
import (
"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 從控制臺(tái)讀取每一行輸入,然后將每一行轉(zhuǎn)換為一個(gè) 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)
}
定義了一個(gè)基本方法 WriteString,用來將數(shù)據(jù)寫入一個(gè)字符串。簡單示例如下:
package main
import (
"fmt"
"io"
"strings"
)
func main() {
var builder strings.Builder
writer := io.StringWriter(&builder)
writer.WriteString("Hello, ")
writer.WriteString("World!")
result := builder.String()
fmt.Println(result) // 輸出:Hello, World!
}
首先創(chuàng)建了一個(gè) strings.Builder,然后使用 io.StringWriter 將 builder 轉(zhuǎn)換為一個(gè) io.Writer,最后使用 builder.String 將最終結(jié)果轉(zhuǎn)換為一個(gè) string。