Go语言可通过接口+结构体封装+委托调用实现代理模式,核心是拦截访问并注入权限、日志、限流等逻辑;需统一使用指针接收器确保接口实现有效。

Go 语言本身没有内置的 Proxy Pattern 语法支持(如 Java 的动态代理),但可以通过接口 + 结构体封装 + 委托调用的方式,干净地实现代理访问控制——核心是“拦截对目标对象的访问,在调用前后加入权限、日志、限流等逻辑”。
用接口定义能力契约
代理模式的前提是面向接口编程。先定义业务对象需暴露的行为接口,而非直接操作具体类型:
- 例如一个文件处理器接口:red">FileOpener,含 Open、Read 方法
- 真实实现叫 RealFileOpener,它只管打开和读取
- 代理类型 AuthProxy 也实现 FileOpener 接口,但内部持有 RealFileOpener 实例
在代理中插入访问控制逻辑
代理结构体封装目标对象,并重写接口方法,在调用前/后执行检查:
- 比如 Open 方法里先调用 checkPermission(user),失败则返回错误,不继续调用真实对象
- 可记录操作日志:log.Printf("User %s opened file %s", user, path)
- 也可做参数校验(如路径是否合法)、资源预占(如加锁)、调用计数(用于限流)
支持组合与链式代理
多个控制逻辑不必耦合在一个代理里。可以分层设计:
立即学习“go语言免费学习笔记(深入)”;
- AuthProxy 负责鉴权
- LogProxy 负责打日志
- RateLimitProxy 负责限流
- 创建时嵌套:RateLimitProxy{Inner: LogProxy{Inner: AuthProxy{Inner: real}}}
注意值接收器与指针接收器一致性
所有代理和真实对象的方法接收器类型要统一(推荐用指针),否则接口实现会失效:
- 如果 RealFileOpener.Open 是指针方法,那 AuthProxy.Open 也必须是指针方法
- 否则 Go 编译器会报错:“AuthProxy does not implement FileOpener”
- 初始化代理时用 &AuthProxy{...},确保传的是指针
基本上就这些。Golang 的代理模式不依赖反射或代码生成,轻量可控,适合构建可插拔的访问控制层。










