Heim >Backend-Entwicklung >Golang >Wie lese ich Daten aus einem Puffer bis zu einem bestimmten Trennzeichen, CRLF, mithilfe einer benutzerdefinierten 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!