两者之间有什么区别
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
go srv.Serve(ln)
和
ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
?
我正在创建自己的ListenAndServe(第一个代码段),以便我可以在调用ListenAndServe之后立即执行代码并将请求发送到服务器。但是,我不能使用tcpKeepAliveListener,因为它没有被导出。 srv.Serve(ln)也可以,但我不知道如果我采用第一种方法,是否会丢失某些东西。
答案 0 :(得分:1)
鉴于启动服务器后将请求发送到服务器的目标,应用程序必须执行侦听并单独服务。
在goroutine中启动ListenAndServe
之后发送请求的方法不能保证服务器在发送请求时正在侦听。在goroutine完全执行之前,主要goroutine可能会继续执行发送。
tcpKeepAliveListener
很短。如果您需要该功能,则将the code复制到您的应用程序中。
这是要使用的代码:
ln, err := net.Listen("tcp", addr)
if err != nil {
log.Fatal(err)
}
go func() {
log.Fatal(srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}))
}()
// The Serve loop is not guaranteed to be running at this point, but
// the listening socket is open and requests to the socket will queue.
... send requests here