c, cancel := context.WithTimeout(ctx, time.Second)
err = enc.RequestWithContext(c, "some", someRequest, &response)
cancel()
enc.RequestWithContext()
может возвращаться нормально, до истечения 1-секундного перерыва, и ресурсы, используемые контекстом, будут немедленно освобождены, только если вы позвоните cancel()
.
cancel()
идемпотентно Вы можете вызывать его несколько раз одновременно с несколькими программами. Последующие звонки oop. Если для контекста уже истекло время ожидания или был вызван cancel()
, то повторный вызов этого не повредит.
Убедиться в том, что отмена вызвана, проще всего с помощью defer, что-то вроде этого:
c, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
err = enc.RequestWithContext(c, "some", someRequest, &response)
Но будьте осторожны, когда этот фрагмент находится внутри al oop: отложенные функции выполняются только тогда, когда завершается окружающая функция, а не когда начинается следующая итерация l oop. В таких случаях вы должны использовать литерал функции или именованную функцию, чтобы убедиться, что отложенные вызовы выполняются до начала следующей итерации. Подробнее см. `defer` в l oop - что будет лучше?
Возможное решение здесь будет:
for ... some loop {
res := func() bool {
c, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
err = enc.RequestWithContext(c, "some", someRequest, &response)
if err != nil {
return false
}
if response.Code == -1 {
return true
}
}()
if res {
break
}
}