Heim  >  Artikel  >  Backend-Entwicklung  >  Wie lese ich Daten aus einem Puffer bis zu einem bestimmten Trennzeichen, CRLF, mithilfe einer benutzerdefinierten SplitFunc in Go?

Wie lese ich Daten aus einem Puffer bis zu einem bestimmten Trennzeichen, CRLF, mithilfe einer benutzerdefinierten SplitFunc in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 09:48:03697Durchsuche

How to read data from a buffer until a specific delimiter, CRLF, using a custom SplitFunc in Go?

Benutzerdefinierter durch Trennzeichen getrennter Reader mit CRLF

Zum Lesen von Daten aus einem Puffer bis zu einem bestimmten Trennzeichen, in diesem Fall dem CRLF (Wagenrücklauf, Zeilenvorschub)-Sequenz, implementieren Sie eine benutzerdefinierte SplitFunc für bufio.Scanner.

<code class="go">// ScanCRLF splits the input data into tokens that are terminated by CRLF.
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 {
        return i + 2, dropCR(data[0:i]), nil
    }
    if atEOF {
        return len(data), dropCR(data), nil
    }
    return 0, nil, nil
}

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

Umschließen Sie den Reader mit dem benutzerdefinierten Scanner und verwenden Sie die Scan()-Funktion, um jede Zeile zu lesen:

<code class="go">// Wrap the reader with the custom scanner
scanner := bufio.NewScanner(this.reader)
scanner.Split(ScanCRLF)

// Read each line using the scanner
for scanner.Scan() {
    // Process the line as needed...
}

// Check for any errors encountered by the scanner
if err := scanner.Err(); err != nil {
    // Log or handle the error
}</code>

Alternative: Lesen einer bestimmten Anzahl von Bytes

Eine andere Möglichkeit besteht darin, eine bestimmte Anzahl von Bytes zu lesen. Zuerst müssen Sie die Größe des Körpers mithilfe des Protokolls bestimmen, z. B. durch Auslesen des „Bytes“-Werts aus der Antwort.

<code class="go">// Read the expected number of bytes
nr_of_bytes, err := this.reader.ReadNumberBytesSomeHow()
if err != nil {
    // Handle the error
}

// Allocate a buffer to hold the body
buf := make([]byte, nr_of_bytes)

// Read the body into the buffer
this.reader.Read(buf)

// Process the body as needed...</code>

Es kann jedoch riskant sein, sich auf den Bytezähler zu verlassen. Es wird empfohlen, den benutzerdefinierten Reader-Ansatz mit CRLF-Trennzeichen zu verwenden, da dieser dem Protokoll besser folgt.

Das obige ist der detaillierte Inhalt vonWie lese ich Daten aus einem Puffer bis zu einem bestimmten Trennzeichen, CRLF, mithilfe einer benutzerdefinierten SplitFunc 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