Heim >Backend-Entwicklung >Golang >Wie lese ich Daten bis zum CRLF-Trennzeichen in Golang mit bufio.Scanner?
So lesen Sie mehrzeilige Daten bis zum CRLF-Trennzeichen in Golang mit bufio
Im bufio-Paket von Golang sind die Funktionen ReadBytes, ReadSlice und ReadString enthalten Wird häufig zum Lesen von Daten verwendet, die durch bestimmte Bytes oder Zeichenfolgen begrenzt sind. Allerdings bietet keine dieser Funktionen eine einfache Möglichkeit, Daten bis zu einem CRLF-Trennzeichen zu lesen, wie es im Beanstalkd-Protokoll erforderlich ist.
Verwendung von bufio.Scanner
Ein besserer Ansatz ist um den Typ bufio.Scanner zu verwenden, um eine benutzerdefinierte Teilungsfunktion zu erstellen, die nach CRLF-Trennzeichen sucht. Dadurch können Sie Daten lesen, bis ein CRLF-Trennzeichen gefunden wird. So geht's:
<code class="go">import ( "bufio" "bytes" ) 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 { // We have a full newline-terminated line. return i + 2, dropCR(data[0:i]), nil } // If we're at EOF, we have a final, non-terminated line. Return it. if atEOF { return len(data), dropCR(data), nil } // Request more data. return 0, nil, nil } func dropCR(data []byte) []byte { if len(data) > 0 && data[len(data)-1] == '\r' { return data[0 : len(data)-1] } return data }</code>
Verwenden Ihres benutzerdefinierten Scanners
Jetzt können Sie Ihren io.Reader mit Ihrem benutzerdefinierten Scanner umschließen und ihn zum Lesen von Daten verwenden bis CRLF-Trennzeichen:
<code class="go">reader := bufio.NewReader(conn) scanner := bufio.NewScanner(reader) scanner.Split(ScanCRLF) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Printf("Invalid input: %s", err) }</code>
Alternativer Ansatz: Lesen einer bestimmten Anzahl von Bytes
Sie können auch eine bestimmte Anzahl von Bytes lesen, wenn Sie die erwartete Anzahl kennen Bytes in den Daten. Dieser Ansatz ist jedoch weniger robust und erfordert eine sorgfältige Validierung, um sicherzustellen, dass Sie nicht zu viele oder zu wenige Daten lesen. Um eine bestimmte Anzahl von Bytes mit dem bufio.Reader-Typ zu lesen:
<code class="go">nr_of_bytes := read_number_of_butes_somehow(conn) buf := make([]byte, nr_of_bytes) reader.Read(buf)</code>
Umgang mit Fehlerbedingungen
Beide oben genannten Ansätze erfordern insbesondere eine sorgfältige Behandlung von Fehlerbedingungen beim Umgang mit teilweisen Lesevorgängen und vorzeitigen EOFs. Stellen Sie sicher, dass Sie die Eingabe validieren und Fehler entsprechend behandeln.
Das obige ist der detaillierte Inhalt vonWie lese ich Daten bis zum CRLF-Trennzeichen in Golang mit bufio.Scanner?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!