我在Go中构建了一个网络应用程序,我看到Conn.Read读取一个有限的字节数组,这个数组是我用make([]字节,2048)创建的,现在的问题是我不知道内容的确切长度,所以它可能太多或者不够。
我的问题是,我如何才能读到确切的数据量?我想我得用bufio,但我不确定。能不能行得通。
我在Go中构建了一个网络应用程序,我看到Conn.Read读取一个有限的字节数组,这个数组是我用make([]字节,2048)创建的,现在的问题是我不知道内容的确切长度,所以它可能太多或者不够。
我的问题是,我如何才能读到确切的数据量?我想我得用bufio,但我不确定。能不能行得通。
It highly depends on what you're trying to do, and what kind of data you're expecting, for example if you just want to read until the EOF you could use something like this:
func main() {
conn, err := net.Dial("tcp", "google.com:80")
if err != nil {
fmt.Println("dial error:", err)
return
}
defer conn.Close()
fmt.Fprintf(conn, "GET / HTTP/1.0
")
buf := make([]byte, 0, 4096) // big buffer
tmp := make([]byte, 256) // using small tmo buffer for demonstrating
for {
n, err := conn.Read(tmp)
if err != nil {
if err != io.EOF {
fmt.Println("read error:", err)
}
break
}
//fmt.Println("got", n, "bytes.")
buf = append(buf, tmp[:n]...)
}
fmt.Println("total size:", len(buf))
//fmt.Println(string(buf))
}
//edit: for completeness sake and @fabrizioM's great suggestion, which completely skipped my mind:
func main() {
conn, err := net.Dial("tcp", "google.com:80")
if err != nil {
fmt.Println("dial error:", err)
return
}
defer conn.Close()
fmt.Fprintf(conn, "GET / HTTP/1.0
")
var buf bytes.Buffer
io.Copy(&buf, conn)
fmt.Println("total size:", buf.Len())
}