Heim > Backend-Entwicklung > Golang > Wie lese ich Daten bis zum CRLF-Trennzeichen in Golang mit bufio.Scanner?

Wie lese ich Daten bis zum CRLF-Trennzeichen in Golang mit bufio.Scanner?

DDD
Freigeben: 2024-10-28 07:14:01
Original
844 Leute haben es durchsucht

How to Read Data until CRLF Delimiter in Golang using 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>
Nach dem Login kopieren

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage