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

Mary-Kate Olsen
Lepaskan: 2024-10-26 20:09:29
asal
112 orang telah melayarinya

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

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

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!

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!