Detaillierte Erläuterung des bufio-Pakets in Golang (5): Gemeinsame Funktionen

Das bufio-Paket in Golang ist eine Standardbibliothek mit gepufferten E/A-Operationen. In den vorherigen Artikeln wurden die Verwendung, Eigenschaften und Verwendungsszenarien der Strukturen bufio.Reader, bufio.Writer und bufio.Scanner ausführlich erläutert. In diesem Artikel werden die Funktionen vorgestellt das Bufio-Paket.

Bevor wir allgemeine Funktionen vorstellen, stellen wir kurz einen anderen Strukturtyp und einen Funktionstyp vor: bufio.ReadWriter und bufio.SplitFunc. Die entsprechenden Definitionen lauten wie folgt:

type ReadWriter struct {
	*Reader
	*Writer
}

type SplitFunc func(data []byte, atEOF bool) (advance int, token []byte, err error)

Die ReadWriter-Struktur implementiert die io.ReadWriter-Schnittstelle, und SplitFunc ist ein Funktionstyp zum Angeben benutzerdefinierter Aufteilungsregeln, der normalerweise in Verbindung mit bufio.Scanner verwendet wird.

Objektfunktion erstellen

  • func NewReader(rd io.Reader) *Reader, erstellt ein gepuffertes Reader-Objekt.
  • func NewWriter(w io.Writer) *Writer, erstellt ein gepuffertes Writer-Objekt.
  • func NewReadWriter(r *Reader, w *Writer) *ReadWriter, erstellt ein gepuffertes ReadWriter-Objekt.
  • func NewReaderSize(rd io.Reader, size int) *Reader, erstellen Sie ein gepuffertes Reader-Objekt, verwenden Sie size, um den Mindestwert des Puffers anzugeben.
  • func NewWriterSize(w io.Writer, size int) *Writer, erstellt ein gepuffertes Writer-Objekt, verwendet size, um den Mindestwert des Puffers anzugeben.
  • func NewScanner(r io.Reader) *Scanner, erstellt ein gepuffertes Scannerobjekt.

Funktion vom Typ SplitFunc

Die folgenden Funktionen sind alle vom Typ SplitFunc und werden normalerweise zusammen mit bufio.NewScanner verwendet.

  • func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error), wird verwendet, um die Daten im Eingabestream Zeile für Zeile zu lesen.
  • func ScanBytes(data []byte, atEOF bool) (advance int, token []byte, err error), wird verwendet, um die Daten im Eingabestream Byte für Byte zu lesen.
  • func ScanRunes(data []byte, atEOF bool) (advance int, token []byte, err error), wird verwendet, um die Daten im Eingabestream einzeln im Unicode-Code zu lesen.
  • func ScanWords(data []byte, atEOF bool) (advance int, token []byte, err error), wird verwendet, um Daten im Eingabestream Wort für Wort (durch Leerzeichen getrennt) zu lesen.

Anwendungsbeispiel

package main

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

func main() {
	// 确定读取文件的路径
	path := "file.txt"

	// 打开文件并处理错误
	file, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// 创建Scanner类型对象
	scanner := bufio.NewScanner(file)

	// 设置分割函数
	scanner.Split(bufio.ScanWords)

	// 创建一个map对象,用于存储单词出现的次数
	counts := make(map[string]int)

	// 读取文件内容并统计单词出现次数
	for scanner.Scan() {
		word := strings.ToLower(scanner.Text())
		counts[word]++
	}

	// 检查Scanner是否出错
	if err := scanner.Err(); err != nil {
		panic(err)
	}

	// 输出结果到控制台
	for word, count := range counts {
		fmt.Printf("%s: %d\n", word, count)
	}

	// 让用户根据输入的关键字进行筛选
	fmt.Print("Enter keyword to filter results: ")
	reader := bufio.NewReader(os.Stdin)
	input, _ := reader.ReadString('\n')
	keyword := strings.TrimSpace(input)

	if keyword != "" {
		for word, count := range counts {
			if strings.Contains(word, keyword) {
				fmt.Printf("%s: %d\n", word, count)
			}
		}
	}
}

Erstellen Sie zunächst ein Objekt vom Typ Scanner, geben Sie ScanWords als Trennfunktion an, durchlaufen Sie dann den Dateiinhalt, zählen Sie, wie oft Wörter angezeigt werden, speichern Sie das Ergebnis in einer Karte und lassen Sie den Benutzer schließlich Schlüsselwörter zum Filtern, Filtern und Ausgeben eingeben nach Stichwortergebnis.

Zusammenfassung

bufio ist ein Paket, das gepufferte Lese- und Schreibvorgänge bereitstellt. Durch die Verwendung der vom bufio-Paket bereitgestellten Typen und Methoden können Daten effizient gelesen und geschrieben werden, insbesondere wenn große Datenmengen gelesen und geschrieben werden müssen, was die Daten erheblich verbessern kann Leistung des Programms.

Guess you like

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