Bagaimana untuk membaca data daripada penimbal sehingga pembatas tertentu, CRLF, menggunakan SplitFunc tersuai dalam Go?

Patricia Arquette
Lepaskan: 2024-10-26 09:48:03
asal
696 orang telah melayarinya

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

Pembaca Dibatas Tersuai dengan CRLF

Untuk membaca data daripada penimbal sehingga pembatas tertentu, dalam kes ini, CRLF (carriage return, suapan baris), laksanakan SplitFunc tersuai untuk 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>
Salin selepas log masuk

Balut pembaca dengan pengimbas tersuai dan gunakan fungsi Scan() untuk membaca setiap baris:

<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>
Salin selepas log masuk

Alternatif: Membaca Bilangan Bait Khusus

Pilihan lain ialah membaca bilangan bait tertentu. Mula-mula, anda perlu menentukan saiz badan menggunakan protokol, cth., dengan membaca nilai "bait" daripada respons.

<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>
Salin selepas log masuk

Walau bagaimanapun, bergantung pada kaunter bait boleh berisiko. Adalah disyorkan untuk menggunakan pendekatan pembaca tersuai dengan pembatas CRLF, kerana ia mengikut protokol dengan lebih dekat.

Atas ialah kandungan terperinci Bagaimana untuk membaca data daripada penimbal sehingga pembatas tertentu, CRLF, menggunakan SplitFunc tersuai dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!