Html Go Reader.read();如何在不重复的情况下获取内容?
我最近开始学习围棋,作为一个辅助项目,并一直试图更好地处理读者界面。具体来说,我试图从一个网站获取内容,然后将其读取到一个字节片 我知道ioutils.ReadAll函数是获取数据的标准方法,但我很好奇为什么我编写的原始函数在输出的末尾有重复的内容 代码: 包干管Html Go Reader.read();如何在不重复的情况下获取内容?,html,web,go,buffer,Html,Web,Go,Buffer,我最近开始学习围棋,作为一个辅助项目,并一直试图更好地处理读者界面。具体来说,我试图从一个网站获取内容,然后将其读取到一个字节片 我知道ioutils.ReadAll函数是获取数据的标准方法,但我很好奇为什么我编写的原始函数在输出的末尾有重复的内容 代码: 包干管 import( "net/http" "fmt" ) func main() { // retrieve url from hacker news. resp, err := http.Get("ht
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=\"\" "
(…)搜索:\n\n
\输入类型=\“文本\”名称=\“q \”值=\“\”
正如您所看到的,由于一个我不太理解的原因,文本的一部分在关闭的标记后面重复;'nput type=\'text\'name=\'q\'value=\'
也许这与缓冲区未被清除有关,也许?有人能提供一些关于我出错原因的见解吗?io.Reader接口返回读取的字节数和错误值。您需要使用这两个值 返回值显示的
int
告诉您有多少字节已被读取到缓冲区中,错误会通知您错误情况以及何时达到EOF。读卡器还可以在同一个调用中返回读取的字节和io.EOF
,因此您也应该处理这个问题
还要注意的是,您为文本
创建了一个500字节的切片,但随后将其追加,在开头留下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的幂对齐时,它们的工作效率最高。)谢谢!不过仅供参考,我认为您在for循环中出现了一个bug(应该是“for err==nil”,否则该循环将永远不会运行)。