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

Patricia Arquette
Freigeben: 2024-10-26 09:48:03
Original
696 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!