Detaillierte Erklärung des Bufio-Pakets in Golang (4): bufio.Scanner

bufio.Scanner

bufio.Scanner ist ein Scanner in Golang zum einzelnen Lesen des Eingabepuffers, der normalerweise zusammen mit bufio.Reader verwendet wird. bufio.Reader wird zum Lesen von Daten aus der Eingabe und bufio.Scanner zum einzelnen Lesen der Eingabe verwendet Der Inhalt des Puffers.

bufio.Scanner kann die Eingabedaten in logische Zeilen aufteilen und diese zurückgeben. Der Scanner unterteilt die Eingabe in Zeilen, indem er eine Split-Funktion definiert. Die Strukturdefinition und die entsprechenden Methoden lauten wie folgt:

type Scanner struct {
	r            io.Reader // The reader provided by the client.
	split        SplitFunc // The function to split the tokens.
	maxTokenSize int       // Maximum size of a token; modified by tests.
	token        []byte    // Last token returned by split.
	buf          []byte    // Buffer used as argument to split.
	start        int       // First non-processed byte in buf.
	end          int       // End of data in buf.
	err          error     // Sticky error.
	empties      int       // Count of successive empty tokens.
	scanCalled   bool      // Scan has been called; buffer is in use.
	done         bool      // Scan has finished.
}

Hier sind einige der wichtigsten von bufio.Writer bereitgestellten Methoden:

  • func (s *Scanner) Scan() bool, wird verwendet, um den nächsten Datenblock im Eingabepuffer zu lesen und ihn im internen Puffer zu speichern. Gibt true zurück, wenn der Lesevorgang erfolgreich war; false, wenn alle Daten gelesen wurden oder ein Fehler aufgetreten ist.
  • func (s *Scanner) Text()-Zeichenfolge, die zum Abrufen des Textinhalts im internen Puffer verwendet wird und normalerweise mit der Scan()-Methode zum Abrufen der gelesenen Daten verwendet wird.
  • func (s *Scanner) Bytes() []Byte, wird zum Abrufen des Byteinhalts im internen Puffer verwendet und wird normalerweise mit der Scan()-Methode zum Abrufen der gelesenen Daten verwendet.
  • func (s *Scanner) Err() Fehler, wird verwendet, um die Fehlerinformationen beim Lesen der Eingabe abzurufen. Wenn während des Lesevorgangs kein Fehler auftritt, wird Null zurückgegeben. Andernfalls wird ein Fehlerobjekt ungleich Null zurückgegeben.
  • func (s *Scanner) Buffer(buf []byte, max int), wird zum Anpassen der Größe des Eingabepuffers verwendet und akzeptiert einen Parameter vom Typ []byte, der zum Angeben der Größe des Puffers verwendet wird.
  • func (s *Scanner) Split(split SplitFunc), wird verwendet, um eine Split-Funktion anzugeben, um die Eingabe in mehrere Datenblöcke aufzuteilen, und akzeptiert einen Parameter vom Typ func([]byte) bool. Die Funktion liest die Eingabe jedes Mal, wenn sie aufgerufen wird, um festzustellen, ob Der aktuelle Datenblock muss in mehrere kleine Blöcke aufgeteilt werden. Wird normalerweise zur Verarbeitung sehr großer Datenblöcke verwendet, um Probleme wie Speicherüberlauf zu vermeiden.

Anwendungsbeispiel

Ein einfaches Anwendungsbeispiel lautet wie folgt:

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	input := "路多辛的所思所想\n很值得一看哦!\n"
	scanner := bufio.NewScanner(strings.NewReader(input))

	// 逐行遍历
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}

	// 错误处理
	if err := scanner.Err(); err != nil {
		fmt.Println("Error:", err)
	}

	// 自定义分隔符
	scanner = bufio.NewScanner(strings.NewReader("路多辛,的,所思所想"))
	scanner.Split(func(data []byte, atEOF bool) (advance int, token []byte, err error) {
		// 分隔符为逗号
		for i, d := range data {
			if d == ',' {
				return i + 1, data[:i], nil
			}
		}
		if atEOF && len(data) > 0 {
			return len(data), data, nil
		}
		return 0, nil, nil
	})
	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}

Laufen Sie, um den Effekt zu sehen

$ go run main.go
路多辛的所思所想
很值得一看哦
路多辛
所思所想

Im ersten Beispiel wird die Standard-Split-Methode verwendet, die die Eingabe Zeile für Zeile liest. Im zweiten Beispiel wird ein benutzerdefiniertes Trennzeichen verwendet, um die Eingabezeichenfolgen durch Kommas zu trennen.

Zusammenfassung

Wenn bufio.Scanner den Puffer liest, speichert er die gelesenen Daten im internen Puffer. Daher wird bei jedem Aufruf der Methode scanner.Scan() ein neuer Datenblock aus der Eingabe gelesen und in einem internen Puffer gespeichert. Wenn Sie alle Daten im Eingabepuffer lesen müssen, müssen Sie die Methode scanner.Scan() so lange aufrufen, bis sie „false“ zurückgibt.

Ich denke du magst

Origin blog.csdn.net/luduoyuan/article/details/131362023
Empfohlen
Rangfolge