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