Detaillierte Erklärung des Strings-Pakets in Golang (2): strings.Reader

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.

Guess you like

Origin blog.csdn.net/luduoyuan/article/details/131254018