strings.Reader
strings.Reader ist eine Struktur, die die Schnittstellen io.Reader, io.Writer, io.ByteReader, io.ByteScanner, io.RuneReader, io.RuneScanner, io.Seeker und io.WriterTo implementiert und zum effizienten Lesen von Daten aus Zeichenfolgen verwendet wird . strings.Reader kann eine Zeichenfolge in einen lesbaren Stream einbinden und die Daten in der Zeichenfolge bequem in die Anwendung einlesen. Die Strukturdefinition und die entsprechenden Methoden lauten wie folgt:
type Reader struct {
s string
i int64 // current reading index
prevRune int // index of previous rune; or < 0
}
func (r *Reader) Len() int
func (r *Reader) Size() int64
func (r *Reader) Read(b []byte) (n int, err error)
func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)
func (r *Reader) ReadByte() (byte, error)
func (r *Reader) UnreadByte() error
func (r *Reader) ReadRune() (ch rune, size int, err error)
func (r *Reader) UnreadRune() error
func (r *Reader) Seek(offset int64, whence int)
func (r *Reader) WriteTo(w io.Writer) (n int64, err error)
func (r *Reader) Reset(s string)
func NewReader(s string) *Reader
Zu den am häufigsten verwendeten Methoden gehören:
- NewReader(): Gibt einen *Reader zurück, der Daten aus der Zeichenfolge s liest.
- Read(b []byte) (n int, err error): Liest len(b) Bytes aus strings.Reader, speichert sie in b und gibt die tatsächliche Anzahl der gelesenen Bytes und mögliche Fehler zurück.
- func (r *Reader) Len() int: Gibt zurück, wie viele Bytes gelesen werden können.
Vorteil
Wie Sie sehen, enthält strings.Reader einen String, den aktuellen Lesepositionsindex und einen intern implementierten lesbaren Stream. Der Typ strings.Reader kann den Inhalt einer Zeichenfolge bequem und effizient lesen. Während des Lesevorgangs speichert der Reader den Lesepositionsindex, der den Startpositionsindex für den nächsten Lesevorgang darstellt. Der Leser verlässt sich auf einen solchen Positionsindex und Slice-Ausdrücke für Zeichenfolgenwerte, um ein schnelles Lesen zu erreichen.
Anwendungsbeispiel
Ein einfaches Anwendungsbeispiel lautet wie folgt:
package main
import (
"fmt"
"strings"
)
func main() {
// 创建一个 strings.Reader 实例
r := strings.NewReader("路多辛的所思所想")
// 读取数据
b := make([]byte, 9)
n, err := r.Read(b)
if err != nil {
fmt.Println("读取数据失败:", err)
return
}
fmt.Printf("读取了 %d 个字节:%s\n", n, string(b[:n]))
}
Führen Sie den Beispielcode aus. Die Ausgabe lautet wie folgt:
$ go run main.go
读取了 9 个字节:路多辛
Nachdem Sie über strings.NewReader eine strings.Reader-Instanz erstellt haben, können Sie die Read-Methode verwenden, um Daten aus der Zeichenfolge zu lesen. Da strings.Reader die io.Reader-Schnittstelle implementiert, können verschiedene auf io.Reader basierende Stream-Verarbeitungsmethoden verwendet werden, z. B. io.LimitReader, io.PipeReader usw.
Zusammenfassung
strings.Reader implementiert die Schnittstellen io.Reader, io.Writer, io.ByteReader, io.ByteScanner, io.RuneReader, io.RuneScanner, io.Seeker und io.WriterTo, sodass String-Daten problemlos gelesen und verarbeitet werden können.
strings.Reader ist auch beim Lesen von Zeichenfolgen sehr effizient, was sich hauptsächlich im Mechanismus zum Lesen von Zeichenfolgen widerspiegelt. Während des Lesevorgangs wird der aktuelle Lesepositionsindex gespeichert und der Positionsindex ist der Startpositionsindex der nächsten Lesung.