Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membaca Data Berbilang Talian Dibataskan oleh CRLF dalam Go?

Bagaimana untuk Membaca Data Berbilang Talian Dibataskan oleh CRLF dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-26 20:09:29101semak imbas

How to Read Multi-Line Data Delimited by CRLF in Go?

Membaca Data Berbilang Talian Dibataskan oleh CRLF dalam Go

Apabila bekerja dengan protokol yang menghantar mesej berbilang baris, adalah perlu untuk mengendalikan data yang dipisahkan dengan talian dengan cekap. Dalam kes ini, persoalan timbul tentang cara membaca data daripada penimbal sehingga CRLF jujukan aksara pembatas berlaku.

Menggunakan bufio Tersuai.SplitFunc

Untuk menangani cabaran ini, satu penyelesaian adalah dengan tentukan bufio.SplitFunc tersuai yang mengiktiraf urutan CRLF sebagai penamatan baris. Berikut ialah contoh pelaksanaan:

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

Fungsi ScanCRLF ini boleh digunakan untuk memisahkan data berdasarkan pembatas CRLF.

Membungkus Pembaca dengan Pengimbas

Dengan fungsi ScanCRLF tersuai, anda boleh membalut io.Reader asal dengan bufio.Pengimbas untuk membaca data dengan lebih cekap:

<code class="go">scanner := bufio.NewScanner(r)
scanner.Split(ScanCRLF)

// Read chunks of data until EOF
for scanner.Scan() {
    fmt.Printf("%s\n", scanner.Text())
}

if err := scanner.Err(); err != nil {
    fmt.Printf("Invalid input: %s", err)
}</code>

Mengendalikan Pembilang Bait Tidak Dijangka

Cadangan alternatif membaca bilangan bait tertentu berdasarkan pembilang bait boleh menjadi tidak boleh dipercayai kerana kemungkinan ralat dalam pembilang itu sendiri. Nilai yang tidak dijangka atau tidak betul dalam kaunter boleh menyebabkan kerosakan data atau mesej dipenggal.

Oleh itu, pendekatan pilihan adalah menggunakan mekanisme seperti mesin keadaan untuk menghuraikan protokol, termasuk arahan dan panjang badan yang dijangkakan, dan untuk mengesahkan panjang badan sebenar terhadap nilai yang dijangkakan ini. Ini memastikan integriti dan keteguhan data.

Atas ialah kandungan terperinci Bagaimana untuk Membaca Data Berbilang Talian Dibataskan oleh CRLF 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