Go's defer
делает это тривиальным.
В Go 1.x определите следующие функции:
func trace(s string) (string, time.Time) {
log.Println("START:", s)
return s, time.Now()
}
func un(s string, startTime time.Time) {
endTime := time.Now()
log.Println(" END:", s, "ElapsedTime in seconds:", endTime.Sub(startTime))
}
После этого вы получите Squeaky Clean сообщения журнала за истекшее время одной строки:
func someFunction() {
defer un(trace("SOME_ARBITRARY_STRING_SO_YOU_CAN_KEEP_TRACK"))
//do a bunch of stuff here...
}
Умная магия заключается в том, что trace () вызывается в начале функции, но un () откладывается до конца.Это не точные атомные часы, из-за операторов лога, но если вам нужна большая точность, этот тип паттерна является одной из сильных сторон Го.
РЕДАКТИРОВАТЬ:
Этот ответ первоначально использовалсяУстаревшее время пакета API.Воспроизводится здесь только для исторической ценности:
Для использования с версиями до 12-01-2011 еженедельно:
func trace(s string) (string, int64) {
log.Println("START:", s)
return s, time.Nanoseconds()
}
func un(s string, startTime int64) {
endTime := time.Nanoseconds()
log.Println(" END:", s, "ElapsedTime in seconds:", float32(endTime-startTime)/1E9)
}