Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya membaca data dengan tepat daripada Go net.Conn?
Membaca Data dengan Ketepatan dalam jaring Go.Conn
Dalam bidang aplikasi rangkaian Go, masalah membaca data dengan tepat daripada jaring.Conn boleh timbul. Fungsi Conn.Read terbina dalam, walaupun mudah, membaca data ke dalam tatasusunan bait yang ditentukan pengguna dengan saiz terhad. Ini boleh menyebabkan peruntukan penimbal yang tidak mencukupi atau berlebihan, bergantung pada saiz data sebenar.
Untuk menangani dilema ini, seseorang boleh memanfaatkan pakej bufio yang berkuasa. Dengan mengembangkan penimbal dalaman secara dinamik mengikut keperluan, bufio menyelaraskan proses membaca kandungan yang tidak diketahui panjangnya. Berikut ialah contoh yang diubah suai:
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) } }
Kod ini memulakan objek bufio.Scanner dengan net.Conn sebagai sumbernya. Pengimbas membaca data secara berterusan sehingga ia menghadapi keadaan akhir fail (EOF) atau ralat. Pendekatan ini secara automatik mengendalikan pengembangan penimbal apabila data distrim masuk, memastikan bacaan yang tepat dan cekap.
Sebagai alternatif, untuk pendekatan yang lebih langsung, anda boleh menggunakan io.Copy, seperti yang dicadangkan oleh @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()) }
Contoh ini menggunakan io.Copy untuk memindahkan kandungan net.Conn ke dalam byte.Buffer, yang mengurus peruntukan dan pengembangan penimbal secara dalaman.
Atas ialah kandungan terperinci Bagaimanakah saya membaca data dengan tepat daripada Go net.Conn?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!