Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Membaca Data sehingga CRLF Delimiter di Golang menggunakan bufio.Scanner?

Bagaimana untuk Membaca Data sehingga CRLF Delimiter di Golang menggunakan bufio.Scanner?

DDD
Lepaskan: 2024-10-28 07:14:01
asal
843 orang telah melayarinya

How to Read Data until CRLF Delimiter in Golang using bufio.Scanner?

Cara Membaca Data Berbilang Talian Sehingga CRLF Delimiter di Golang dengan bufio

Dalam pakej bufio Golang, fungsi ReadBytes, ReadSlice dan ReadString adalah biasa digunakan untuk membaca data yang dibatasi oleh bait atau rentetan tertentu. Walau bagaimanapun, tiada satu pun daripada fungsi ini menyediakan cara mudah untuk membaca data sehingga pembatas CRLF, seperti yang diperlukan dalam protokol Beanstalkd.

Menggunakan bufio.Scanner

Pendekatan yang lebih baik ialah untuk menggunakan jenis bufio.Scanner untuk mencipta fungsi split tersuai yang mencari pembatas CRLF. Ini membolehkan anda membaca data sehingga pembatas CRLF ditemui. Begini cara untuk melakukannya:

<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

Menggunakan Pengimbas Tersuai Anda

Kini, anda boleh membalut io.Reader anda dengan pengimbas tersuai anda dan menggunakannya untuk membaca data sehingga pembatas CRLF:

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

for scanner.Scan() {
    fmt.Println(scanner.Text())
}

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

Pendekatan Alternatif: Membaca Bilangan Bait Tertentu

Anda juga boleh membaca bilangan bait tertentu jika anda mengetahui bilangan bait yang dijangkakan bait dalam data. Walau bagaimanapun, pendekatan ini kurang mantap dan memerlukan pengesahan berhati-hati untuk memastikan anda tidak membaca terlalu banyak atau terlalu sedikit data. Untuk membaca bilangan bait tertentu menggunakan bufio.Jenis pembaca:

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

Mengendalikan Keadaan Ralat

Kedua-dua pendekatan di atas memerlukan pengendalian keadaan ralat yang teliti, terutamanya apabila berurusan dengan bacaan separa dan EOF pramatang. Pastikan anda mengesahkan input dan mengendalikan ralat mengikut kesesuaian.

Atas ialah kandungan terperinci Bagaimana untuk Membaca Data sehingga CRLF Delimiter di Golang menggunakan bufio.Scanner?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan