github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/11_reflect/decorator/demo1.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"runtime"
     7  	"time"
     8  )
     9  
    10  type SumFunc func(int64, int64) int64
    11  
    12  func getFunctionName(i interface{}) string {
    13  	//  Go 语言的反射机器来获取函数名
    14  
    15  	return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name()
    16  }
    17  
    18  func timedSumFunc(f SumFunc) SumFunc {
    19  
    20  	return func(start, end int64) int64 {
    21  		defer func(t time.Time) {
    22  			fmt.Printf("--- Time Elapsed (%s): %v ---\n",
    23  				getFunctionName(f), time.Since(t))
    24  		}(time.Now())
    25  		return f(start, end)
    26  	}
    27  }
    28  
    29  func Sum1(start, end int64) int64 {
    30  	var sum int64
    31  	sum = 0
    32  	if start > end {
    33  		start, end = end, start
    34  	}
    35  	for i := start; i <= end; i++ {
    36  		sum += i
    37  	}
    38  	return sum
    39  }
    40  func Sum2(start, end int64) int64 {
    41  	if start > end {
    42  		start, end = end, start
    43  	}
    44  	return (end - start + 1) * (end + start) / 2
    45  }
    46  func main() {
    47  	sum1 := timedSumFunc(Sum1)
    48  	sum2 := timedSumFunc(Sum2)
    49  	fmt.Printf("%d, %d\n", sum1(-10000, 10000000), sum2(-10000, 10000000))
    50  }