ReadString() 是否丢弃换行符后的字节?

2023-12-08

我正在尝试通过以下方式从网络连接读取数据:

func getIn(conn net.Conn){
    for{
        in, err := bufio.NewReader(conn).ReadString('\n')
        if err!=nil{
            fmt.Printf(err.Error())
        }
        fmt.Printf("[%s]", in)
    }
}

发送到该连接的输入流具有以下模式:

消息1\n 消息2\n 消息3\n 消息4\n 消息5\n

etc...

我注意到我的函数会跳过消息,输出例如:

消息1\n消息2\n消息4\n 消息5\n

这让我认为每次遇到换行符时 bufio ReadString 方法都会丢弃传入的缓冲区。假设缓冲区由以下部分组成:

消息1\n混乱

在阅读的那一刻。然后,message1被读取,其余部分mess被丢弃。这也不完全有意义,因为那么下一个输入应该是age2,但实际上是message3.

我使用了另一个函数 net.Conn.Read(),它确实不会跳过输入的任何部分,但需要我进行更多的字符串解析。如何让 ReadString() 函数为我工作?


ReadString()不丢弃数据,它仍然是buffered in bufio.Reader对象,即:

conn := bytes.NewBufferString("message1\n message2\n message3\n ")
reader := bufio.NewReader(conn)

in, _ := reader.ReadString('\n')                 // "message1\n"
fmt.Println(strconv.Quote(in))
in, _ = reader.ReadString('\n')                  // "message2\n"
fmt.Println(strconv.Quote(in))
fmt.Println(strconv.Quote(conn.String()))        // ""

请注意,尽管所有数据均已从conn缓冲区,仍然可以通过后续访问reader.ReadString()称呼。但是,您在每次迭代时都会丢弃读取器对象,并且所有数据都会丢失。

您应该在循环外创建缓冲读取器,这样您的读取器仍然位于第二个循环中:

reader := bufio.NewReader(conn)
for {
    in, err := reader.ReadString('\n')
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReadString() 是否丢弃换行符后的字节? 的相关文章

  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • Golang 按位运算以及一般字节操作

    我有一些 C 代码 可以对字节执行一些按位运算 我正在尝试在 golang 中做同样的事情 但遇到了困难 C 中的示例 byte a c byte data int j c data j c byte c j c a c 0xFF c 0x
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • Go 无法推断赋值中的类型:“non-name on left side of :=”

    该片段按预期工作play golang org p VuCl OKMav http play golang org p VuCl OKMav i 10 next 11 prev i i next 然而这个几乎相同的片段给出了non name
  • 使用 OpenTelemetry 统一不同服务的范围

    我刚刚开始使用 OpenTelemetry 并为此创建了两个 微 服务 Standard and GeoMap 最终用户将请求发送到Standard服务 该服务又将请求发送到GeoMap在将结果返回给最终用户之前获取信息 我使用 gRPC
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • 我应该避免在 golang 中使用单例包吗?

    现在我有一个包裹store包含以下内容 package store var db Database func Open url string error open db connection func FindAll model inter
  • 使用 Gorilla 会话自定义后端有什么优势?

    我想使用 Redis 进行会话管理 但我不明白使用 Redis 作为 Gorilla 会话包的自定义后端比直接使用它有什么优势 Gorilla 会话包的链接 http www gorillatoolkit org pkg sessions
  • 为什么Golang无法从前面小写字符的struct生成json?

    我正在尝试打印我创建的结构体的 json 结果 如下所示 type Machine struct m ip string m type string m serial string 并打印出来 m Machine m ip test m t
  • 为什么 Go 中的函数不能命名为“init”?

    所以 今天在编码时我发现创建一个名为init产生错误method init not found 但是当我将其重命名为startup一切都很好 init 这个词是为 Go 中的某些内部操作而保留的 还是我在这里遗漏了一些东西 是的 该功能in
  • 尝试使用 pkg-config 但它不是注册命令

    好的 我已经在 Windows 8 下建立了整个 Go 开发环境 也使用了 MinGW 我正在使用LiteIde C Go bin go exe build C Users Alyx Go Hi pkg config cflags sdl
  • 指针和切片引用类型 - 接收器

    我认为一旦向我提出这个问题就会有点明显 但现在以下内容还没有点击 type Stack interface func stack Stack Push x interface stack append stack x 我有一个名为 Stac
  • 非本地包中的本地导入

    我知道应该避免本地进口 但在这种情况下有特殊情况需要 这是一个私人仓库 heroku buildpack 在go get 由于服务器上缺少私钥 与绝对 URL 一起使用时会出现此阶段 现在我得到这个错误local import in non
  • 解组此 xml 时遇到问题

    尝试了解如何在 Go 中解组 XML 通读多个示例和 stackoverflow 问题 我想要的是一个包含系统上安装的所有补丁的切片 我什至无法解组补丁 没有错误 只是一个空切片 可能做的事情基本上是错误的 提前感谢您的任何建议
  • 如何最大限度地减少 Go 中的垃圾收集?

    有时您可能想避免 最小化垃圾收集器 所以我想确定如何做到这一点 我认为下一个是正确的 在函数的开头声明变量 使用数组代替切片 还有吗 为了最大限度地减少 Go 中的垃圾收集 您必须最大限度地减少堆分配 为了最大限度地减少堆分配 您必须了解分
  • 如何退出执行延迟调用的 go 程序?

    我需要使用defer释放手动创建的分配C图书馆 但我还需要os Exit在某个时刻具有非 0 状态 棘手的部分是os Exit跳过任何延迟指令 package main import fmt import os func main defe
  • Golang 使用 gomail.v2 实现多个收件人

    我通过 gomail v2 发送电子邮件的唯一方法是在 for 循环中对每封电子邮件使用 Send 函数 但我需要向其他电子邮件地址显示已发送相同的电子邮件 for recipient range os Args 3 mail SetAdd

随机推荐