Чтобы ответить на вопрос в заголовке: можно безопасно оставить ctx.Done()
. Канал, возвращаемый Done()
, не всегда необходим, просто во многих случаях использования контекста подпрограмма go ожидает один или несколько каналов и должна также ожидать контекст, чтобы он мог прервать свою работу. Другими словами, он ожидает канала, возвращенного из ctx.Done()
и других каналов, используя оператор select
.
Но если вы просто запускаете некоторые вызовы в потенциально долгосрочном l oop тогда вам не нужно использовать Done()
, но вы можете просто проверить, возвращает ли Err()
ненулевое значение.
Надеюсь, я прав, предполагая, что это то, что вам нужно:
func runit(ctx context.Context) {
for i := 0; i < 5; i++ {
fmt.Println(i)
time.Sleep(1 * time.Second)
if ctx.Err() != nil {
return // abort the calcs
}
}
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
runit(ctx)
fmt.Println(ctx.Err())
}
Или, может быть, вы хотите попробовать контекст в выборе:
select {
case <-ctx.Done():
fmt.Println("Context cancelled (after 1 second)")
case <-time.After(3 * time.Second):
fmt.Println("Not Done")
}