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

标签 go

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

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

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

message1\n message2\n message3\n message4\n message5\n

等...

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

message1\nmessage2\nmessage4\n message5\n

这让我想到每次遇到换行符时 bufio ReadString 方法都会丢弃传入缓冲区。假设缓冲区包括:

message1\nmess

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

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

最佳答案

ReadString() 不会丢弃数据,它仍然在 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')
    ...

关于go - ReadString() 是否丢弃换行符后的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46309810/

相关文章:

go - Doom Emacs 中对 golang 的完整 IDE 功能支持

http - 强制 Gitlab 在 Go 失败时重试 Webhook

http - Golang,发送OCSP请求返回

http - 为什么端口是字符串而不是整数?

go - 如何将 []byte 解码为 json 结构,该结构作为值存储在字符串类型的变量中?

Go:通过管道发送 gob 挂起 - 更新:进程外 http.ResponseWriter 正在阻塞

go - 使用 goavro 处理多种类型的解码数据

eclipse - 运行 Go 程序出错

google-app-engine - 如何在运行 AppEngine 的 Go 服务器生成的响应中设置 HTTP header ?

go - gmail-api : Mail content formats are getting distorted (Code Lang : Go)