Обёртка с таймаутом и логированием для долгой функции
Условие задачи
Нужно реализовать обёртку над функцией, которая выполняется непредсказуемо долго и возвращает число. Менять код самой функции нельзя, так как предполагается, что она содержит, например, сетевой запрос. Обёртка должна запускать эту функцию с таймаутом (например, 1 секунда): если функция успела завершиться — возвращаем результат, если нет — возвращаем ошибку. Также необходимо вывести в лог время выполнения вызова. Сигнатуру обёртки разрешено изменять
gopackage main
import (
"fmt"
"math/rand"
"time"
)
func init() {
rand.Seed(time.Now().UnixNano())
}
// Есть функция, работающая неопределённо долго и возвращающая число.
// Её тело нельзя изменить (представим, что внутри сетевой запрос).
func unpredictableFunc() int64 {
rnd := rand.Int63n(5000)
time.Sleep(time.Duration(rnd) * time.Millisecond)
return rnd
}
// Нужно изменить функцию обёртку, которая будет работать с заданным таймаутом (например, 1 секунду).
// Если "длинная" функция отработала за это время — отлично, возвращаем результат.
// Если нет — возвращаем ошибку. Результат работы в этом случае нам не важен.
// Дополнительно нужно измерить, сколько выполнялась эта функция (просто вывести в лог).
// Сигнатуру функции обёртки менять можно.
func predictableFunc() int64 {
return unpredictableFunc()
}
func main() {
fmt.Println("Started")
fmt.Println(predictableFunc())
}