首頁 >後端開發 >Golang >如何使用 bufio.Scanner 在 Golang 中讀取資料直到 CRLF 分隔符號?

如何使用 bufio.Scanner 在 Golang 中讀取資料直到 CRLF 分隔符號?

DDD
DDD原創
2024-10-28 07:14:01849瀏覽

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

如何在Golang 中使用bufio 讀取多行資料直到CRLF 分隔符號

Golang 的bufio 套件中,ReadBytes 和ReadBytes 和ReadBytes 和ReadBytes 和ReadBytes 和ReadBytes 和ReadBytes 和ReadBytes 和ReadBytes函數是通常用於讀取由特定位元組或字串分隔的資料。然而,這些函數都沒有提供一種簡單的方法來讀取數據,直到按照 Beanstalkd 協議的要求使用 CRLF 分隔符。

使用 bufio.Scanner

更好的方法是使用 bufio.Scanner 類型建立尋找 CRLF 分隔符號的自訂分割函數。這允許您讀取數據,直到遇到 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>

使用自訂掃描器

現在,您可以使用自訂掃描器包裝io.Reader 並使用它來讀取數據直到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>

替代方法:讀取特定數量的位元組

如果您知道預期的位元組數,也可以讀取特定數量的位元組資料中的位元組。然而,這種方法不太穩健,需要仔細驗證以確保您不會讀取太多或太少的資料。要使用bufio.Reader 類型讀取特定數量的位元組:

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

處理錯誤條件

上述兩種方法都需要仔細處理錯誤條件,尤其是當處理部分讀取和過早的EOF 時。確保驗證輸入並適當處理錯誤。

以上是如何使用 bufio.Scanner 在 Golang 中讀取資料直到 CRLF 分隔符號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn