conchan := make(chan bool)
stop := false
var conn net.Conn
go func() {
select {
case <-conchan:
...
close(conchan)
return
case <-time.After(time.Second * 5):
...
e := listener.Close()
stop = true
if e != nil {
fmt.Printf("%v\n", e)
}
return
}
}()
// blocks
conn, _ = listener.Accept()
conchan <- true