- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有下一个代码:
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')
}
有人可以解释为什么第一个解决方案有这样的行为吗?
最佳答案
import "bufio"
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/
我在运行 OSX 10.9.1 的 Mac 上的 Dr. Java 工作室中运行 javac v1.6.0-65 我收到以下警告: Quick.java:53: warning: [deprecati
我有以下代码,我需要快速执行,但它需要花费大量时间来更改值,无论如何都要加快此任务的速度? 我正在使用 indexOf() 和 substring() 来完成此任务。这是为了改变 LED 条颜色。 /
我正在处理一个带有“客户制造”数据库的项目。他开发了一个 C++/CLI 应用程序,该应用程序使用 BinaryWriter.Write(String) 和 BinaryReader.ReadStri
我正在尝试通过以下方式从网络连接中读取数据: func getIn(conn net.Conn){ for{ in, err := bufio.NewReader(conn).
由于最新的更新 Android Studio 给了我以下警告: Expected type does not accept nulls in Kotlin, but the value may be
我正在开发一个解析器来接收 UDP 信息、解析它并存储它。为此,我使用了 BinaryReader,因为它主要是二进制信息。其中一些将是字符串。 MSDN says对于 ReadString() 函数
我正在从文件中读取记录并插入到数据库中。 我正在使用 DB2 数据库。 记录是这样的: abc pqr abcd 所以在 abc 之前,记录的开头也有几个空格。 我正在使用 Spring
我想使用 System.Xml.XmlReader.ReadString(),但我注意到它没有出现在 Intellisense 中,因为该函数用 [EditorBrowsable(EditorBrow
我正在从我的 android 设备向 esp32 发送一个字符串,我想将 SerialBT.readString() 值存储到一个字符串变量,但它存储为一个空字符串,我该怎么办? if (Serial
我有下一个代码: resp, err := http.Get("https://www.google.com") if err != nil{ panic(err) } r := bufio.
这个问题在这里已经有了答案: Multiple values in single-value context (6 个答案) 关闭 3 年前。 这里是新手。 我正在尝试在 go1.11.4 wind
我正在编写一个应用程序来逐行读取文件列表并进行一些处理。我想尽可能少地使用 RAM。我遇到了这个问题 https://stackoverflow.com/a/41741702/3531263 张贴者说
我将 Parcelable 对象放入 Intent 到下一个 Activity: val intent = Intent(mContext, ShowTestActivity::class.java)
我正在编写代码来从文件中读取字符串。使用时String s = StdIn.readAll();效果很好。但我不明白为什么,通过使用 while (!StdIn.readString().isEmpt
目的是在COM端口中输入“ on”和“ off”并切换引脚13。无论我做什么。它不会打开或关闭。需要帮忙。我试图查看我输入的字符串是否为“ on”。它打印“开”,但是当我检查结果时,它显示出不同的结果
我创建了一个名为 useraccounts.txt 的文本文件。我想做的一切使用文件句柄类读取文件,但我总是得到这个异常 Exception in thread "LWJGL Application"
您好,我是 HTK 的新手,并已遵循 http://htk.eng.cam.ac.uk/ 的 HTK 书中的“使用 HTK 的教程示例” 我已经到了必须使用“HCompV”的地步(3.2.1 第 6
package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(o
我这样做是为了在 CTRL-C 时不再要求输入。 我目前拥有的是一个单独的 go-routine,在收到 CTRL-C 后,会更改变量的值,因此它不会请求另一行。但是,我似乎找不到绕过当前行的方法。
我有一个套接字客户端读取这样的响应: message, err := bufio.NewReader(conn).ReadString('\n') 它工作得很好,但 ReadString 方法似乎对缓
我是一名优秀的程序员,十分优秀!