在Go 的net.Conn 中準確讀取資料
在Go 網路應用領域,問題精確地從網路讀取資料。 Conn 可能會出現。內建的 Conn.Read 函數雖然方便,但可以將資料讀取到使用者定義的大小有限的位元組數組中。這可能會導致緩衝區分配不足或過多,具體取決於實際資料大小。
為了解決這個困境,可以利用強大的 bufio 包。透過根據需要動態擴展內部緩衝區,bufio 簡化了讀取未知長度內容的過程。以下是一個修改後的範例:
package main import ( "bufio" "fmt" "io" "net" ) 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") // Create a bufio.Scanner to read the response. scanner := bufio.NewScanner(conn) // Iterate over the lines of the response. for scanner.Scan() { line := scanner.Text() fmt.Println(line) } // Check for any errors that occurred during scanning. if err := scanner.Err(); err != nil { fmt.Println("scanner error:", err) } }
此程式碼使用 net.Conn 作為其來源來初始化 bufio.Scanner 物件。掃描器會連續讀取數據,直到遇到文件結束 (EOF) 條件或錯誤。這種方法會在資料流入時自動處理緩衝區擴展,確保準確且有效率的讀取。
或者,對於更直接的方法,您可以使用io.Copy,如@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") // Create a bytes.Buffer to store the response. var buf bytes.Buffer io.Copy(&buf, conn) // Print the total size of the response. fmt.Println("total size:", buf.Len()) }
此範例使用io.Copy 將net.Conn 的內容傳送到bytes.Buffer 中,此緩衝區內部管理緩衝區分配和擴展。
以上是如何從 Go net.Conn 準確讀取資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!