timeout.go 728 B

123456789101112131415161718192021222324252627282930313233
  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func longSQLQuery() chan bool {
  7. ch := make(chan bool, 1)
  8. go func() {
  9. time.Sleep(2 * time.Second)
  10. ch <- true
  11. }()
  12. return ch
  13. }
  14. func main() {
  15. // при 1 выполнится таймаут, при 3 - выполнится операция
  16. timer := time.NewTimer(3 * time.Second)
  17. select {
  18. case <-timer.C:
  19. fmt.Println("timer.C timeout happend")
  20. case <-time.After(time.Minute):
  21. // пока не выстрелит - не соберётся сборщиком мусора
  22. fmt.Println("time.After timeout happend")
  23. case result := <-longSQLQuery():
  24. // освобождет ресурс
  25. if !timer.Stop() {
  26. <-timer.C
  27. }
  28. fmt.Println("operation result:", result)
  29. }
  30. }