Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membaca Data dalam Potongan daripada `net.Conn` dalam Go?
Dalam Go, anda boleh mengakses sambungan rangkaian mentah menggunakan net.Conn.Read, yang membaca paket data masuk ke dalam tatasusunan bait. Walau bagaimanapun, apabila anda tidak mengetahui saiz tepat data yang masuk, membaca ke dalam tatasusunan bersaiz tetap boleh membawa kepada pemangkasan data atau penimbalan yang tidak diperlukan.
Untuk mengendalikan perkara ini, anda boleh menggunakan pendekatan yang lebih fleksibel menggunakan pakej bufio atau teknik alternatif.
Pakej bufio menyediakan jenis Pembaca, yang membolehkan anda untuk membaca data dalam ketulan. Anda boleh mencipta objek Reader daripada sambungan net.Conn anda, dan kemudian gunakan kaedah ReadSlice atau ReadBytes untuk membaca data sehingga pembatas tertentu ditemui atau penghujung input dicapai. Sebagai contoh, untuk membaca data sehingga penghujung paket, anda boleh menggunakan kod berikut:
package main import ( "bufio" "fmt" "net" ) func main() { conn, err := net.Dial("tcp", "google.com:80") if err != nil { fmt.Println("dial error:", err) return } defer conn.Close() // Create a bufio.Reader from the net.Conn reader := bufio.NewReader(conn) // Read data in chunks until the end of the packet buf := []byte{} for { chunk, err := reader.ReadSlice('\n') if err != nil { if err != io.EOF { fmt.Println("read error:", err) } break } buf = append(buf, chunk...) } fmt.Println("total size:", len(buf)) // fmt.Println(string(buf)) }
Sebagai alternatif, anda boleh menggunakan bait.Jenis penimbal untuk menambahkan masukan ketulan data dan kumpulkan jumlah saiz:
package main import ( "bytes" "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() // Create a bytes.Buffer to accumulate incoming data var buf bytes.Buffer // Copy data from the net.Conn to the Buffer if _, err = io.Copy(&buf, conn); err != nil { fmt.Println("copy error:", err) } fmt.Println("total size:", buf.Len()) }
Dengan menggunakan salah satu pendekatan ini, anda boleh mengendalikan panjang data yang berbeza-beza tanpa pemotongan data atau penimbalan yang berlebihan, memastikan pemindahan data yang cekap melalui sambungan rangkaian dalam Go.
Atas ialah kandungan terperinci Bagaimana untuk Membaca Data dalam Potongan daripada `net.Conn` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!