func WithTimeout(dur time.Duration, fn func() error) error {
var ch = make(chan error, 1)
go time.AfterFunc(dur, func() {
ch <- errors.New("函数执行超时: " + pkg.Caller.FromFunc(reflect.ValueOf(fn)))
})
go func() {
defer func() {
if err := recover(); err != nil {
switch err.(type) {
case error:
ch <- err.(error)
default:
log.Fatalln(err)
}
}
}()
ch <- fn()
}()
return <-ch
}