Cara Membaca Mesej CRLF-Delimited dalam Go with Bufi

Barbara Streisand
Lepaskan: 2024-10-27 01:04:02
asal
620 orang telah melayarinya

How to Read CRLF-Delimited Messages in Go with Bufi

Menentukan Sempadan Mesej dengan CR(LF) Pembatas Menggunakan Go's Bufio

Pengenalan

Dalam Go, bufio menyediakan cara yang mudah untuk membaca dan menulis data secara penimbal. Walau bagaimanapun, apabila berurusan dengan mesej yang dipisahkan oleh pembatas suapan talian pulangan (CRLF), tingkah laku lalai bufio.ReadLine mungkin tidak mencukupi. Artikel ini meneroka pendekatan alternatif untuk membaca mesej dengan pembatas CRLF menggunakan bufio.

Membaca Mesej dengan Pembatas CRLF

Untuk membaca mesej dengan pembatas CRLF, kami boleh menggunakan bufio.Scanner bersama-sama dengan tersuai fungsi pengimbasan. Kaedah SplitFunc membolehkan kami mentakrifkan fungsi tersuai yang menentukan sempadan setiap mesej.

<code class="go">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
}</code>
Salin selepas log masuk

Dalam fungsi pengimbasan tersuai, kami mencari pembatas CRLF dan mengembalikan mesej dengan sewajarnya. Fungsi dropCR memastikan bahawa sebarang r yang mengekori dialih keluar daripada mesej.

Kini, kami boleh membalut pembaca kami dengan pengimbas tersuai:

<code class="go">scanner := bufio.NewScanner(this.reader)
scanner.Split(ScanCRLF)</code>
Salin selepas log masuk

Dengan memanggil Scan, kami boleh mengulangi melalui mesej dalam pembaca:

<code class="go">for scanner.Scan() {
    fmt.Printf("%s\n", scanner.Text())
}</code>
Salin selepas log masuk

Pendekatan Alternatif: Membaca Bilangan Bait Tertentu

Pendekatan alternatif ialah membaca bilangan bait tertentu seperti yang dinyatakan dalam pengepala mesej. Walau bagaimanapun, kaedah ini terdedah kepada ketidakkonsistenan dan boleh menyebabkan tingkah laku yang tidak dijangka jika kiraan bait yang dijangkakan tidak betul atau jika terdapat data tambahan dalam penimbal pembaca.

Untuk menggunakan pendekatan ini, kita boleh membaca baris pengepala terlebih dahulu. untuk mendapatkan bilangan bait yang dijangkakan:

<code class="go">res, err := this.reader.ReadLine('\n')</code>
Salin selepas log masuk

Kemudian, kita boleh mencipta pembaca terhad dengan bilangan bait yang dijangkakan:

<code class="go">nr_of_bytes := // read_number_of_butes_somehow(this.reader)
limitedReader := io.LimitReader(this.reader, int64(nr_of_bytes))</code>
Salin selepas log masuk

Akhir sekali, kita boleh membaca kandungan mesej daripada pembaca terhad:

<code class="go">buf := make([]byte, nr_of_bytes)
limitedReader.Read(buf)</code>
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini mempunyai hadnya dan secara amnya disyorkan untuk bergantung pada pendekatan berasaskan mesej menggunakan pembatas CRLF.

Atas ialah kandungan terperinci Cara Membaca Mesej CRLF-Delimited dalam Go with Bufi. 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!