谁能看出来问题在哪里 #狗头
代码:
package future
import (
"context"
)
type Future[T any] interface {
Await() (T, error)
Cancel()
}
type future[T any] struct {
ret chan result[T]
ctx context.Context
cancel context.CancelFunc
}
type result[T any] struct {
dat T
err error
}
func Async[T any](fn func() (T, error)) Future[T] {
return AsyncWithContext(context.Background(), fn)
}
func AsyncWithContext[T any](ctx context.Context, fn func() (T, error)) Future[T] {
c := make(chan result[T], 1)
fctx, cancel := context.WithCancel(ctx)
go func() {
ret, err := fn()
c <- result[T]{dat: ret, err: err}
}()
return &future[T]{ret: c, ctx: fctx, cancel: cancel}
}
func (f *future[T]) Await() (T, error) {
var result result[T]
select {
case <-f.ctx.Done():
result.err = f.ctx.Err()
case ret := <-f.ret:
result = ret
}
f.cancel()
return result.dat, result.err
}
func (f *future[T]) Cancel() {
f.cancel()
}
用法是:
f := future.Async(myfunc)
// 去干其他事
result, err := f.Await()