Heim  >  Artikel  >  Backend-Entwicklung  >  Wie lese ich durch CRLF getrennte mehrzeilige Daten in Go?

Wie lese ich durch CRLF getrennte mehrzeilige Daten in Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-26 20:09:29101Durchsuche

How to Read Multi-Line Data Delimited by CRLF in Go?

Lesen von durch CRLF getrennten mehrzeiligen Daten in Go

Bei der Arbeit mit Protokollen, die mehrzeilige Nachrichten übertragen, ist es notwendig, zeilengetrennte Daten effizient zu verarbeiten. In diesem Fall stellt sich die Frage, wie Daten aus einem Puffer gelesen werden sollen, bis die Trennzeichenfolge CRLF auftritt.

Verwendung eines benutzerdefinierten bufio.SplitFunc

Um dieser Herausforderung zu begegnen, besteht eine Lösung darin: Definieren Sie eine benutzerdefinierte bufio.SplitFunc, die die CRLF-Sequenz als Zeilenabschluss erkennt. Hier ist eine Beispielimplementierung:

<code class="go">import (
    "bufio"
    "bytes"
)

func ScanCRLF(data []byte, atEOF bool) (advance int, token []byte, err error) {
    if atEOF && len(data) == 0 {
        return 0, nil, nil
    }
    if i := bytes.Index(data, []byte{'\r', '\n'}); i >= 0 {
        // We have a full newline-terminated line.
        return i + 2, dropCR(data[0:i]), nil
    }
    // If we're at EOF, we have a final, non-terminated line. Return it.
    if atEOF {
        return len(data), dropCR(data), nil
    }
    // Request more data.
    return 0, nil, nil
}

func dropCR(data []byte) []byte {
    if len(data) > 0 && data[len(data)-1] == '\r' {
        return data[0 : len(data)-1]
    }
    return data
}</code>

Diese ScanCRLF-Funktion kann verwendet werden, um Daten basierend auf CRLF-Trennzeichen aufzuteilen.

Leser mit Scanner umschließen

Mit der benutzerdefinierten ScanCRLF-Funktion Sie können den ursprünglichen io.Reader mit einem bufio.Scanner umschließen, um Daten effizienter zu lesen:

<code class="go">scanner := bufio.NewScanner(r)
scanner.Split(ScanCRLF)

// Read chunks of data until EOF
for scanner.Scan() {
    fmt.Printf("%s\n", scanner.Text())
}

if err := scanner.Err(); err != nil {
    fmt.Printf("Invalid input: %s", err)
}</code>

Umgang mit unerwarteten Bytezählern

Der alternative Vorschlag, eine bestimmte Anzahl von Bytes basierend auf zu lesen Ein Bytezähler kann aufgrund möglicher Fehler im Zähler selbst unzuverlässig sein. Unerwartete oder falsche Werte im Zähler können zu Datenbeschädigungen oder abgeschnittenen Nachrichten führen.

Daher besteht der bevorzugte Ansatz darin, einen Zustandsmaschinen-ähnlichen Mechanismus zu verwenden, um das Protokoll zu analysieren, einschließlich des Befehls und der erwarteten Körperlänge. und um die tatsächliche Körperlänge mit diesem erwarteten Wert zu vergleichen. Dies gewährleistet Datenintegrität und Robustheit.

Das obige ist der detaillierte Inhalt vonWie lese ich durch CRLF getrennte mehrzeilige Daten in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn