go 语言虽无原生装饰器语法,但可通过高阶函数、接口和组合实现等效功能:函数类型适合轻量日志等简单场景,接口+结构体支持可配置的重试、超时等复杂逻辑,需注意 panic 捕获局限、context 透传、性能开销及关注点分离原则。
Go 语言没有原生的装饰器语法(比如 Python 的 @decorator),但完全可以通过高阶函数、接口和组合来实现等效的装饰器模式——关键不在“语法糖”,而在“行为增强”的意图是否清晰、可复用、不侵入原逻辑。
用函数类型实现最简装饰器
Go 中最轻量的装饰器,就是把一个 func() 或带参数/返回值的函数,包装成另一个函数,在调用前后插入横切逻辑:
type Handler func(string) string
<p>func LoggingDecorator(h Handler) Handler {
return func(s string) string {
fmt.Println("→ entering with:", s)
result := h(s)
fmt.Println("← exiting with:", result)
return result
}
}</p><p>// 使用
origin := func(s string) string { return "hello " + s }
decorated := LoggingDecorator(origin)
decorated("world") // 输出日志 + "hello world"
- 核心是返回新函数,而非修改原函数——符合 Go 的不可变习惯
- 注意闭包捕获的变量生命周期:若装饰器内部持有长生命周期资源(如数据库连接),需确保其释放时机可控
- 多个装饰器嵌套时,顺序直接影响执行流:
AuthDecorator(LoggingDecorator(h))表示先鉴权再打日志
用接口+结构体实现可配置装饰器
当需要传参、状态或复用多个装饰逻辑(如重试、超时、熔断)时,函数闭包会变得臃肿。此时应定义接口,并用结构体封装行为与配置: