首頁 > 後端開發 > Golang > 主體

Go中如何讀取以CRLF分隔的多行資料?

Mary-Kate Olsen
發布: 2024-10-26 20:09:29
原創
112 人瀏覽過

How to Read Multi-Line Data Delimited by CRLF in Go?

在 Go 中讀取由 CRLF 分隔的多行資料

使用傳送多行訊息的協定時,有必要有效地處理行分隔資料。在這種情況下,出現的問題是如何從緩衝區讀取數據,直到出現分隔符號字元序列 CRLF。

使用自訂 bufio.SplitFunc

要解決這個挑戰,一種解決方案是定義一個自訂 bufio.SplitFunc ,將 CRLF 序列識別為行終止符。以下是範例實作:

<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>
登入後複製

此 ScanCRLF 函數可用於根據 CRLF 分隔符號分割資料。

使用Scanner 包裝Reader

使用自訂ScanCRLF 函數,你可以用bufio.Scanner 包裝原始io.Reader 更有效地讀取資料:

<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>
登入後複製

處理意外位元組計數器

基於讀取特定位元組數的替代建議由於計數器本身存在潛在錯誤,位元組計數器可能不可靠。計數器中意外或不正確的值可能會導致資料損壞或訊息被截斷。

因此,首選方法是使用類似狀態機的機制來解析協議,包括命令和預期的正文長度,並根據該預期值驗證實際體長。這確保了數據的完整性和穩健性。

以上是Go中如何讀取以CRLF分隔的多行資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!