Вставка / замена кода Голанга

Мне нравится не допустить повторения кода. Но у меня есть ситуация, когда я должен повторять это в каждой функции, я хочу измерить время выполнения, и я ничего не могу с этим поделать. Например, функция:

func someFunc() {
    start_time := time.Now()
    defer fmt.Println("Execution time: %v", time.Now().Sub(start_time))
    <... doing some bussiness ...>
}

Теперь я должен повторить эти два первых удара в каждой функции (а в оригинале они более сложны из-за вызова имени функции). Поэтому я не могу сделать функцию, которая измеряет время, потому что я должен использовать defer внутри него. Я не могу создать функцию даже для второго удара, потому что в оригинале она вызывает имя функции в Println, и поэтому полученное имя не будет иметь нужной функции. Есть ли способ вставить этот код по какой-либо метке или шаблону, например, так:

func someFunc() {
//go-insert measuretime.tmpl
    <... doing some bussiness ...>
}

И measuretime.tmpl это:

start_time := time.Now()
defer fmt.Println("Execution time: %v", time.Now().Sub(start_time))

1 ответ

Этот прием может помочь: отложить вызов функции, возвращающей функцию, включающую время начала.

func elapsed() func() {
    start := time.Now()
    return func() {
        fmt.Println("Duration was", time.Since(start))
    }
}

Назовите это следующим образом:

defer elapsed()()

Играть

Сказав это, бенчмаркинг является обычным способом измерения производительности в Go. Посмотрите, как писать тесты в Go.

Другие вопросы по тегам