Получите время, необходимое для выполнения функции в Go - PullRequest
0 голосов
/ 31 января 2019

Оператор defer откладывает выполнение функции до тех пор, пока не вернется окружающая функция.Однако, если я пытаюсь напечатать время, необходимое для выполнения следующей функции, он всегда печатает 0.

func sum() {
    start := time.Now()

    //expecting to print non zero value but always gets 0
    defer fmt.Println(time.Now().Sub(start))

    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
}

Фрагмент: https://play.golang.org/p/46dxtS5beET

1 Ответ

0 голосов
/ 31 января 2019

Аргументы для отложенной функции оцениваются в точке, в которой функция отложена.Измените следующий код, чтобы оценить истекшее время, как вы ожидаете:

defer func() { fmt.Println(time.Now().Sub(start)) }()

Используемая здесь логика синхронизации может быть помещена в функцию многократного использования:

// timer returns a function that logs message and the elapsed time from
// the call to timer and the returned function. The returned function is
// intended to be used in a defer statement:
//   defer timer("sum")()
func timer(message string) func() {
    start := time.Now()
    return func() { fmt.Println(message, time.Since(start)) }
}

func sum() {
    defer timer("sum")()

    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...