type ByteReader interface { ReadByte() (byte, error)}定義了一個基本方法 ReadByte,用于讀取數(shù)據(jù)源中的單個字節(jié),如果沒有字節(jié)可讀,返回非 nil 的錯誤。
標(biāo)準(zhǔn)庫中的 bufio.Reader 實(shí)現(xiàn)了該接口,從一個 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)) }}type ByteScanner interface { ByteReader UnreadByte() error}是 io.ByteReader 接口的擴(kuò)展,提供了一個額外的方法:UnreadByte,UnreadByte方法讓下一次調(diào)用 ReadByte 時(shí)返回之前調(diào)用 ReadByte 時(shí)返回的同一個字節(jié)。
// ByteWriter is the interface that wraps the WriteByte method.type ByteWriter interface { WriteByte(c byte) error}定義了一個基本方法 ReadByte,用于向數(shù)據(jù)源中寫入單個字節(jié)的能力,
標(biāo)準(zhǔn)庫中的 bufio.Writer 實(shí)現(xiàn)了該接口,從字節(jié)序列中構(gòu)造并提供緩沖輸出,簡單示例如下:
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())}type RuneReader interface { ReadRune() (r rune, size int, err error)}用于從字符流中讀取 Unicode 碼點(diǎn)(Rune),定義了一個基本方法 ReadRune,接受一個參數(shù)類型為 rune 的指針,并返回讀取的 Rune 以及錯誤類型。
io.RuneReader 通常與 bufio.Reader 一起使用,用于構(gòu)建高效的文本讀取器。例如如下示例,使用 bufio.Reader 讀取一個文件并逐行解析其中的 Unicode 碼點(diǎn):
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) } }}type RuneScanner interface { RuneReader UnreadRune() error}擴(kuò)展了 io.RuneReader 接口,添加了一個名為 UnreadRune 的方法,用于撤消最近讀取的 Rune,并使下一次讀取的時(shí)候再次返回該 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 從控制臺讀取每一行輸入,然后將每一行轉(zhuǎn)換為一個 strings.Reader,并將其傳遞給 bufio.NewReader 來掃描 Rune。
// StringWriter is the interface that wraps the WriteString method.type StringWriter interface { WriteString(s string) (n int, err error)}定義了一個基本方法 WriteString,用來將數(shù)據(jù)寫入一個字符串。簡單示例如下:
package mainimport ( "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)建了一個 strings.Builder,然后使用 io.StringWriter 將 builder 轉(zhuǎn)換為一個 io.Writer,最后使用 builder.String 將最終結(jié)果轉(zhuǎn)換為一個 string。
本文鏈接:http://m.rrqrq.com/showinfo-26-5145-0.htmlGolang 中的 IO 包詳解:單字節(jié)操作接口
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 淺析 Parcel 的 Rust 打包算法 Demo
下一篇: 低碳 Web 實(shí)踐指南