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

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

我最近开始学习围棋,作为一个辅助项目,并一直试图更好地处理读者界面。具体来说,我试图从一个网站获取内容,然后将其读取到一个字节片

我知道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=\"\" "
(…)搜索:\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”,否则该循环将永远不会运行)。