gpt4 book ai didi

循环中的 bufio ReadString 是无限的

转载 作者:数据小太阳 更新时间:2023-10-29 03:43:52 28 4
gpt4 key购买 nike

我有下一个代码:

resp, err := http.Get("https://www.google.com")

if err != nil{
panic(err)
}

r := bufio.NewReader(resp.Body)

for v, e := r.ReadString('\n'); e == nil; {
fmt.Println(v)
}

所以,我想在循环中读取响应主体,但阅读器 r 无限读取 Body 的第一行。

同时,这段代码工作正常:

v, e := r.ReadString('\n')
for e == nil {
fmt.Println(v)
v, e = r.ReadString('\n')
}

有人可以解释为什么第一个解决方案有这样的行为吗?

最佳答案

Package bufio

import "bufio"

func (*Reader) ReadString

func (b *Reader) ReadString(delim byte) (string, error)

ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter. If ReadString encounters an error before finding a delimiter, it returns the data read before the error and the error itself (often io.EOF). ReadString returns err != nil if and only if the returned data does not end in delim. For simple uses, a Scanner may be more convenient.


这是一个 XY problem : XY 问题是询问您尝试的解决方案而不是您的实际问题。

您为什么不采纳 bufio.ReadString 文档中给出的建议“对于简单用途,Scanner 可能更方便”?

正确使用 bufio.ReadString 很复杂,即使您知道如何使用 for 循环也是如此。请参见函数 reader

正确使用 bufio.Scannner 很简单,即使您不知道如何使用 for 循环。请参阅函数 scanner

例如,

package main

import (
"bufio"
"fmt"
"io"
"net/http"
"os"
"strings"
)

func reader(url string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()

// ReadString
r := bufio.NewReader(resp.Body)
for {
line, err := r.ReadString('\n')
if len(line) == 0 && err != nil {
if err == io.EOF {
break
}
return err
}
line = strings.TrimSuffix(line, "\n")

fmt.Println(line)

if err != nil {
if err == io.EOF {
break
}
return err
}
}

return nil
}

func scanner(url string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()

// Scanner
s := bufio.NewScanner(resp.Body)
for s.Scan() {
line := s.Text()

fmt.Println(line)

}
if s.Err() != nil {
return err
}

return nil
}

func main() {
url := "https://www.example.com"
fmt.Println("\nReader:\n")
err := reader(url)
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
fmt.Println("\nScanner:\n")
err = scanner(url)
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
fmt.Println("\n")
}

Playground :https://play.golang.org/p/e0WY_aNxW8

关于循环中的 bufio ReadString 是无限的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47479564/

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