Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk membaca data daripada penimbal sehingga pembatas tertentu, CRLF, menggunakan SplitFunc tersuai dalam Go?

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

Patricia Arquette
Patricia Arquetteasal
2024-10-26 09:48:03796semak imbas

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>

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>

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>

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!

Kenyataan:
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