python的装饰器和go的filter
python的装饰器:
# python的装饰器写法,接收函数做为参数,返回内部定义的函数
def log(func):
def wrapper(*args, **kwargs):
print("call %s(): " % func.__name__)
return func(*args, **kwargs)
return wrapper
def log2(func):
return lambda *args, **kwargs: func(*args, **kwargs)
@log
def now():
print("2022-01-01")
if __name__ == "__main__":
now()
go的filter写法,接收函数作为参数,返回同类型的函数:
package main
import (
"fmt"
"time"
)
type handleFunc func(c *Context)
// FilterBuilder 是一个接收Filter
type FilterBuilder func(next Filter) Filter
// Filter 是一个函数
type Filter func(c *Context)
// MetricsFilterBuilder 一个实现FilterBuilder的例子
// 不就是在原来的函数上做了一下包装?类似于装饰器?
func MetricsFilterBuilder(next Filter) Filter {
return func(c *Context) {
start := time.Now().Nanosecond()
next(c)
end := time.Now().Nanosecond()
fmt.Printf("cost time: %v\n", end - start)
}
}
比如,如下对一个函数进行包装:
// 一个函数原型
type handleFunc func(path string) error
// 对handleFn进行包装, 使得调用此函数会打印其耗费时间
func filter (f handleFunc) handleFunc {
return func(path string) error {
start := time.Now()
defer func() {
fmt.Printf("cost time: %v\n", time.Since(start))
}()
return f(path)
}
}
func dirPath(path string) error {
fmt.Println("start Dir")
time.Sleep(5 * time.Second)
fmt.Println("end Dir")
return nil
}
func main() {
dirPath := filter(dirPath)
if err := dirPath("home"); err != nil {
fmt.Println(err)
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术