http.Server only offers flavors of Serve() without a way to shut them down. Closing the listener should make the server stop, but there seems to be a race in TLS servers where this does not always work. Further, in-progress requests cannot complete before exiting without some kind of wrapper for net.Listener and net.Conn which includes synchronization between Listener.Accept() and Conn.Close(). See https://groups.google.com/d/topic/golang-nuts/i4_kPK-rVxI/discussion for some details. A use-case for this is zero-downtime restarts: a master process opens a listener and then spawns a slave, passing it the listener. When the master receives a SIGHUP, it spawns a new slave. When the slave starts servicing requests, it signals the master and the master signals the old slave to shutdown. The old slave must shutdown gracefully to prevent service interruption.