如何在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中文網其他相關文章!