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.
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.
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>
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!