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)) }}
type ByteScanner interface { ByteReader UnreadByte() error}
是 io.ByteReader 接口的擴展,提供了一個額外的方法:UnreadByte,UnreadByte方法讓下一次調用 ReadByte 時返回之前調用 ReadByte 時返回的同一個字節。
// 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())}
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) } }}
type RuneScanner interface { RuneReader UnreadRune() 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。
// 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.Builder writer := 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.tebozhan.com/showinfo-26-5145-0.htmlGolang 中的 IO 包詳解:單字節操作接口
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 淺析 Parcel 的 Rust 打包算法 Demo
下一篇: 低碳 Web 實踐指南