首页 > 后端开发 > 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学习者快速成长!