gpt4 book ai didi

html - 去 Reader.read();如何在不重复的情况下获取内容?

转载 作者:IT王子 更新时间:2023-10-29 01:42:07 26 4
gpt4 key购买 nike

我最近开始研究 Go 作为一个业余项目,并一直在努力更好地处理 Reader 界面。具体来说,我正在尝试从网站获取内容,然后将其读取为字节 slice 。

我知道 ioutils.ReadAll 函数是获取数据的规范方式,但我很好奇为什么我编写的原始函数在输出末尾有重复的内容。

代码: 包主

import(
"net/http"
"fmt"
)

func main() {
// retrieve url from hacker news.
resp, err := http.Get("http://news.ycombinator.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
text := make([]byte, 500)
buf := make([]byte, 200)
i, _ := resp.Body.Read(buf)
for i != 0 {
text = append(text,buf...)
i, _ = resp.Body.Read(buf)
}
fmt.Println(resp.ContentLength)
fmt.Println(resp.Status)
fmt.Printf("%q\n", text)

}

内容:

         (...)Search:\n  <input type=\"text\" name=\"q\" value=\"\" size=\"17\" autocorrect=\"off\" spellcheck=\"false\" autocapitalize=\"off\" autocomplete=\"false\"></form>\n            </center></td></tr>      
</table></center></body></html>\nput type=\"text\" name=\"q\" value=\"\" "

如您所见,由于我不太明白的原因,文本的一部分在结束标记后重复; 'nput type=\"text\"name=\"q\"value=\"\""'。

也许这与缓冲区未被清除有关?谁能提供一些关于我出错的见解?

最佳答案

io.Reader 接口(interface)返回读取的字节数和错误值。您需要利用这两个值。

int 返回值显示告诉您有多少字节已读入缓冲区,而 error 会通知您错误情况以及到达 EOF 的时间。 Reader 也可能在同一调用中返回读取的字节和 io.EOF,因此您也应该处理它。

另请注意,您为 text 创建了一个 500 字节的 slice ,但随后附加到它,在开头留下 500 个空字符。

var text []byte
buf := make([]byte, 256)

var n int
var err error

for err == nil {
n, err = resp.Body.Read(buf)
text = append(text, buf[:n]...)
}

if err != io.EOF {
log.Fatal("error:", err)
}

(与 Go 无关,内存块在与 2 的幂对齐时往往工作效率最高。)

关于html - 去 Reader.read();如何在不重复的情况下获取内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37473290/

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