package future import ( "context" ) type SetValueFuture[T any] struct { value T err error isCompleted bool completeChan chan any } func NewSetValue[T any]() *SetValueFuture[T] { return &SetValueFuture[T]{ completeChan: make(chan any), } } func (f *SetValueFuture[T]) SetComplete(val T, err error) { f.value = val f.err = err f.isCompleted = true close(f.completeChan) } func (f *SetValueFuture[T]) SetValue(val T) { f.value = val f.isCompleted = true close(f.completeChan) } func (f *SetValueFuture[T]) SetError(err error) { f.err = err f.isCompleted = true close(f.completeChan) } func (f *SetValueFuture[T]) Error() error { return f.err } func (f *SetValueFuture[T]) Value() T { return f.value } func (f *SetValueFuture[T]) IsComplete() bool { return f.isCompleted } // 等待直到Complete或者ctx被取消。 // 注:返回ErrContextCancelled不代表产生结果的过程没有执行过,甚至不代表Future没有Complete func (f *SetValueFuture[T]) Wait(ctx context.Context) error { select { case <-f.completeChan: return f.err case <-ctx.Done(): return ErrContextCancelled } } func (f *SetValueFuture[T]) WaitValue(ctx context.Context) (T, error) { select { case <-f.completeChan: return f.value, f.err case <-ctx.Done(): var ret T return ret, ErrContextCancelled } } type SetValueFuture2[T1 any, T2 any] struct { value1 T1 value2 T2 err error isCompleted bool completeChan chan any } func NewSetValue2[T1 any, T2 any]() *SetValueFuture2[T1, T2] { return &SetValueFuture2[T1, T2]{ completeChan: make(chan any), } } func (f *SetValueFuture2[T1, T2]) SetComplete(val1 T1, val2 T2, err error) { f.value1 = val1 f.value2 = val2 f.err = err f.isCompleted = true close(f.completeChan) } func (f *SetValueFuture2[T1, T2]) SetValue(val1 T1, val2 T2) { f.value1 = val1 f.value2 = val2 f.isCompleted = true close(f.completeChan) } func (f *SetValueFuture2[T1, T2]) SetError(err error) { f.err = err f.isCompleted = true close(f.completeChan) } func (f *SetValueFuture2[T1, T2]) Error() error { return f.err } func (f *SetValueFuture2[T1, T2]) Value() (T1, T2) { return f.value1, f.value2 } func (f *SetValueFuture2[T1, T2]) IsComplete() bool { return f.isCompleted } func (f *SetValueFuture2[T1, T2]) Wait() error { <-f.completeChan return f.err } func (f *SetValueFuture2[T1, T2]) WaitValue(ctx context.Context) (T1, T2, error) { select { case <-f.completeChan: return f.value1, f.value2, f.err case <-ctx.Done(): var ret1 T1 var ret2 T2 return ret1, ret2, ErrContextCancelled } }