因此,我在Go中构建了一个网络应用程序,我看到它Conn.Read读入了我创建时使用的有限字节数组,make([]byte, 2048)现在的 问题 是我不知道内容的确切长度,因此它可能是太多或不足。 我的问题是我如何才能读取准确的数据量。我认为我必须使用bufio,但不确定。
Conn.Read
make([]byte, 2048)
bufio
这在很大程度上取决于您要执行的操作以及所期望的数据类型,例如,如果您只想读到EOF,则可以使用以下内容:
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\r\n\r\n") 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:出于完整性考虑,@ fabrizioM提出了很棒的建议,这完全让我无视:
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\r\n\r\n") var buf bytes.Buffer io.Copy(&buf, conn) fmt.Println("total size:", buf.Len()) }