Аргументы для отложенной функции оцениваются в точке, в которой функция отложена.Измените следующий код, чтобы оценить истекшее время, как вы ожидаете:
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)
}