Maison >développement back-end >Golang >Comment lire les données d'un tampon jusqu'à un délimiteur spécifique, CRLF, à l'aide d'un SplitFunc personnalisé dans Go ?

Comment lire les données d'un tampon jusqu'à un délimiteur spécifique, CRLF, à l'aide d'un SplitFunc personnalisé dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 09:48:03795parcourir

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

Lecteur délimité personnalisé avec CRLF

Pour lire les données d'un tampon jusqu'à un délimiteur spécifique, dans ce cas, le CRLF (retour chariot, saut de ligne), implémentez un SplitFunc personnalisé pour 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>

Enveloppez le lecteur avec le scanner personnalisé et utilisez la fonction Scan() pour lire chaque ligne :

<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 : lire un nombre spécifique d'octets

Une autre option consiste à lire un nombre spécifique d'octets. Tout d'abord, vous devez déterminer la taille du corps à l'aide du protocole, par exemple en lisant la valeur « octets » de la réponse.

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

Cependant, se fier au compteur d'octets peut être risqué. Il est recommandé d'utiliser l'approche du lecteur personnalisé avec le délimiteur CRLF, car elle suit de plus près le protocole.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn