Maison >développement back-end >Golang >Comment lire avec précision les données d'un Go net.Conn ?
Lecture des données avec précision dans le réseau Go.Conn
Dans le domaine des applications réseau Go, le problème de la lecture précise des données d'un net.Conn peut survenir. La fonction Conn.Read intégrée, bien que pratique, lit les données dans un tableau d'octets défini par l'utilisateur avec une taille limitée. Cela peut conduire à une allocation de tampon insuffisante ou excessive, en fonction de la taille réelle des données.
Pour résoudre ce dilemme, on peut tirer parti du puissant package bufio. En élargissant dynamiquement le tampon interne selon les besoins, bufio rationalise le processus de lecture de contenu de longueur inconnue. Voici un exemple modifié :
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) } }
Ce code initialise un objet bufio.Scanner avec net.Conn comme source. Le scanner lit les données en continu jusqu'à ce qu'il rencontre une condition de fin de fichier (EOF) ou une erreur. Cette approche gère automatiquement l'expansion de la mémoire tampon au fur et à mesure que les données sont transmises, garantissant une lecture précise et efficace.
Alternativement, pour une approche plus directe, vous pouvez utiliser io.Copy, comme suggéré par @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()) }
Cet exemple utilise io.Copy pour transférer le contenu du net.Conn dans un bytes.Buffer, qui gère en interne l'allocation de tampon et expansion.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!