package main
import (
"context"
"fmt"
"time"
)
func main() {
ret := TaskWithTimeout(DoSomething, time.Second*3)
fmt.Println("ret:", ret)
time.Sleep(time.Second * 4) // 等待,若无则看不到最后一行打印
}
func TaskWithTimeout(task func(), duration time.Duration) bool {
ctx, cancel := context.WithTimeout(context.Background(), duration)
defer cancel()
done := make(chan struct{}, 1)
go func() {
task()
done <- struct{}{}
}()
select {
case <-done:
fmt.Println("done")
return false
case <-ctx.Done():
fmt.Println("main", ctx.Err())
return true
}
}
func DoSomething() {
fmt.Println("[in] DoSomething")
time.Sleep(time.Second * 4)
fmt.Println("[out] DoSomething")
}
[in] DoSomething
main context deadline exceeded
ret: true
[out] DoSomething