Как проверить условие, остановить тикер и выйти из приложения, если условие истинно, а если нет, и истекло время ожидания выхода из приложения - PullRequest
0 голосов
/ 28 марта 2020

На моем следующем коде k == 3 и я отправляю true на канал, но он не проверяет case x, ok , чтобы напечатать " тест пройден " и os.Exit (20) (я хочу, чтобы приложение выходило при первом истинном условии и игнорировало time.Sleep (timeout) )

и с другой стороны, когда Я изменяю k: = 4 Я хочу выйти из приложения после 10se c и печатать " Время ожидания " с os.Exit (10)

func main() {
    timeout := time.Second * 10
    sleepTime := 5 * time.Second
    done := make(chan bool)
    ticker := time.NewTicker(sleepTime)

    go func() {
        for {
            select {
            case x,ok := <-done:
                if ok {
                    if x {
                        //Test passed
                        log.Println("** Test Passed **")
                        os.Exit(20)
                    }else {
                        //Timeout
                        log.Println("Timeout occurred")
                        os.Exit(10)
                    }
                }
                return
            case <-ticker.C:
                // Validate
                log.Println("ticker")
                //Check for condition and if its true send true to channel
                k := 3
                if k == 3 {
                    done <- true
                }

            }
        }
    }()

    time.Sleep(timeout)
    done <- false
}

1 Ответ

0 голосов
/ 28 марта 2020

Первый случай с k==3 не будет работать, потому что вы пишете на канал done, но ничего не слушаете, поэтому он там висит. Если вы хотите выйти для случая k==3, вместо записи в канал поместите код, который существует прямо здесь.

Вторая часть, когда k==4, вероятно, работает, потому что, когда основное время ожидания, он записывает done, который будет получен первым регистром в select. Но, вероятно, программа заканчивается до того, как у нее есть шанс выполнить. Вы можете перевести спящий режим в режим main после записи на канал done, чтобы убедиться в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...