谁能看出来问题在哪里 #狗头
代码:
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()
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.