Dalam Go, fungsi Listen.Accept menyekat pelaksanaan sehingga sambungan diterima. Ini menyukarkan untuk menghentikan pelayan mendengar dengan anggun kerana anda tidak dapat membezakan antara ralat dan sambungan tertutup.
Satu penyelesaian ialah menggunakan saluran selesai untuk memberi isyarat apabila pelayan harus berhenti mendengar. Ini membolehkan anda menutup soket mendengar tanpa mendapat ralat.
Berikut ialah contoh cara melakukannya:
// Echo server struct type EchoServer struct { listen net.Listener done chan bool } // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // If we called stop() then there will be a value in es.done, so // we'll get here and we can exit without showing the error. default: log.Printf("Accept failed: %v", err) } return } go es.respond(conn.(*net.TCPConn)) } } // Stop the server by closing the listening listen func (es *EchoServer) stop() { es.done <- true // We can advance past this because we gave it buffer of 1 es.listen.Close() // Now it the Accept will have an error above }
Kod ini menggunakan saluran siap untuk memberi isyarat apabila pelayan harus berhenti mendengar. Apabila kaedah henti dipanggil, ia menghantar nilai ke saluran yang telah selesai, yang menyebabkan kaedah servis keluar.
Ini membolehkan anda menghentikan pelayan mendengar dengan anggun tanpa mendapat ralat.
Atas ialah kandungan terperinci Bagaimana untuk Menghentikan Pelayan Go Listening Tanpa Ralat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!