首页  >  文章  >  后端开发  >  如何使用 bufio.Scanner 在 Golang 中读取数据直到 CRLF 分隔符?

如何使用 bufio.Scanner 在 Golang 中读取数据直到 CRLF 分隔符?

DDD
DDD原创
2024-10-28 07:14:01747浏览

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

如何在 Golang 中使用 bufio 读取多行数据直到 CRLF 分隔符

Golang 的 bufio 包中,ReadBytes、ReadSlice 和 ReadString 函数是通常用于读取由特定字节或字符串分隔的数据。然而,这些函数都没有提供一种简单的方法来读取数据,直到按照 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