Go ReadString()是否在换行后丢弃字节?

Go ReadString()是否在换行后丢弃字节?,go,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

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

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

等等

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

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

这使我想到,每当遇到换行符时,bufio ReadString方法就会丢弃传入的缓冲区。假设缓冲区包括:

消息1\n消息

在阅读的时候。然后,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对象,所有数据都会丢失

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

reader := bufio.NewReader(conn)
for {
    in, err := reader.ReadString('\n')
    ...

尝试在循环之外创建一次读取器,而不是在每次迭代中创建
ReadString
读取的内容超出了
\n
的范围,但由于您不断创建新的读取器,因此会丢失缓冲数据。谢谢。这确实是解决办法,谢谢。NewReader函数的名称应该给我一个提示,告诉我它是做什么的,为什么会在那里。。。