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 }