Я пытаюсь реализовать Шаблон времени ожидания для моего проекта.Вот пример кода по вышеуказанной ссылке:
c1 := make(chan string, 1)
go func() {
time.Sleep(2 * time.Second)
c1 <- "result 1"
}()
select {
case res := <-c1:
fmt.Println(res)
case <-time.After(1 * time.Second):
fmt.Println("timeout 1")
}
Другой пример:
c2 := make(chan string, 1)
go func() {
time.Sleep(2 * time.Second)
c2 <- "result 2"
}()
select {
case res := <-c2:
fmt.Println(res)
case <-time.After(3 * time.Second):
fmt.Println("timeout 2")
}
Я могу успешно запустить этот пример.Затем я пытаюсь применить это к моему проекту.Вот мой код проекта:
for {
select {
case ev := <-c.EventChannel():
// do something here
case <-time.After(2 * time.Second):
// this condition never happend
return
default:
// do nothing as non-blocking channel pattern
}
}
Но я не знаю, почему код никогда не запускается в случае тайм-аута.Когда я перемещаю time.After(2 * time.Second)
в отдельное утверждение, это работает.Вот модифицированный код:
timeout := time.After(2 * time.Second)
for {
select {
case ev := <-c.EventChannel():
// do something here
case <-timeout:
require.Equal(t, "time out after 2s", "")
default:
// do nothing as non-blocking channel pattern
}
}
Я не знаю различий между двумя случаями.И почему первый пример работает.Пожалуйста, помогите мне разобраться.
Спасибо