Вы можете использовать контекст для получения тайм-аутов и отмены, не требуя никакого дополнительного API.
type runner struct{}
func (r *runner) StartProcessing(ctx context.Context) {
go func() {
for {
select {
case <-ctx.Done():
return
default:
}
fmt.Println("doing stuff")
time.Sleep(1 * time.Second)
}
}()
}
Это дает вам возможность установить тайм-аут или отменить его в любое время.Вы также можете использовать существующие контексты, которые могут потребовать таймаута или отмены раньше без вашего ведома.
// normal timeout after 10 seconds
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
run.StartProcessing(ctx)
// decide to cancel early
time.Sleep(3 * time.Second)
cancel()