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