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