gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:02:45 33 4
gpt4 key购买 nike

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

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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com