在Go 中,bufio 提供了一種便捷的資料讀寫方式以緩衝的方式。但是,在處理由回車換行符 (CRLF) 分隔符號分隔的訊息時,bufio.ReadLine 的預設行為可能不夠。本文探討了使用 bufio 讀取帶有 CRLF 分隔符號的訊息的替代方法。
要讀取帶有 CRLF 分隔符號的訊息,我們可以將 bufio.Scanner 與自訂函數結合使用掃描功能。 SplitFunc 方法讓我們可以定義一個自訂函數來決定每個訊息的邊界。
<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>
在自訂掃描函數中,我們搜尋 CRLF 分隔符號並相應地返回訊息。 dropCR 函數確保從訊息中刪除任何尾隨的 r。
現在,我們可以使用自訂掃描器包裝我們的閱讀器:
<code class="go">scanner := bufio.NewScanner(this.reader) scanner.Split(ScanCRLF)</code>
透過呼叫Scan,我們可以迭代閱讀器中的訊息:
<code class="go">for scanner.Scan() { fmt.Printf("%s\n", scanner.Text()) }</code>
另一種方法是讀取訊息標頭中指定的特定數量的位元組。然而,這種方法很容易出現不一致的情況,如果預期的位元組計數不正確或讀取器緩衝區中有其他數據,則可能會導致意外的行為。
要使用這種方法,我們可以先讀取標題行來獲得預期的位元組數:
<code class="go">res, err := this.reader.ReadLine('\n')</code>
然後,我們可以建立一個具有預期位元組數的有限讀取器:
<code class="go">nr_of_bytes := // read_number_of_butes_somehow(this.reader) limitedReader := io.LimitReader(this.reader, int64(nr_of_bytes))</code>
最後,我們可以從受限讀者:
<code class="go">buf := make([]byte, nr_of_bytes) limitedReader.Read(buf)</code>
但是,這種方法有其局限性,通常建議依賴使用CRLF 分隔符的基於訊息的方法。
以上是如何使用 Bufi 讀取 Go 中以 CRLF 分隔的訊息的詳細內容。更多資訊請關注PHP中文網其他相關文章!